十九种Elasticsearch字符串搜索方式终极介绍
前言
刚开始接触Elasticsearch的时候被Elasticsearch的搜索功能搞得晕头转向,每次想在Kibana里面查询某个字段的时候,查出来的结果经常不是自己想要的,然而又不知道问题出在了哪里。出现这个问题归根结底是因为对于Elasticsearch的底层索引原理以及各个查询搜索方式的不了解,在Elasticsearch中仅仅字符串相关的查询就有19个之多,如果不弄清楚查询语句的工作方式,应用可能就不会按照我们预想的方式运作。这篇文章就详细介绍了Elasticsearch的19种搜索方式及其原理,老板再也不用担心我用错搜索语句啦!
简介
Elasticsearch为所有类型的数据提供实时搜索和分析,不管数据是结构化文本还是非结构化文本、数字数据或地理空间数据,都能保证在支持快速搜索的前提下对数据进行高效的存储和索引。用户不仅可以进行简单的数据检索,还可以聚合信息来发现数据中的趋势和模式。
搜索是Elasticsearch系统中重要的一个功能,它支持结构化查询、全文查询以及结合二者的复杂查询。结构化查询有点像SQL查询,可以对特定的字段进行筛选,然后按照特定的字段进行排序得到结果。全文查询会根据查询字符串寻找相关的文档,并且按照相关性排序。
Elasticsearch内包含很多种查询类型,下面介绍是其中重要的19种。如果你的app想要添加一个搜索框,为用户提供搜索操作,并且数据量很大用MySQL会造成慢查询想改用Elasticsearch,那么我相信这篇文章会给你带来很大的帮助。
query和filter区别
在正式进入到搜索部分之前,我们需要区分query(查询)和filter(过滤)的区别。
在进行query的时候,除了完成匹配的过程,我们实际上在问“这个结果到底有多匹配我们的搜索关键词”。在所有的返回结果的后面都会有一个_score
字段表示这个结果的匹配程度,也就是相关性。相关性越高的结果就越排在前面,相关性越低就越靠后。当两个文档的相关性相同的时候,会根据lucene内部的doc_id
字段来排序,这个字段对于用户是不可见的也不能控制。
而在进行filter的时候,仅仅是在问“这个文档符不符合要求”,这仅仅是一个过滤的操作判断文档是否满足我们的筛选要求,不会计算任何的相关性。比如timestamp
的范围是否在2019和2020之间,status
状态是否是1等等。
在一个查询语句里面可以同时存在query
和filter
,只不过只有query
的查询字段会进行相关性_score
的计算,而filter
仅仅用来筛选。比如在下面的查询语句里面,只有title
字段会进行相关性的计算,而下面的status
只是为了筛选并不会计算相关性。
GET /_search
{
"query": {
"bool": {
"must": [
{"match": {"title": "Search"}}
],
"filter": [
{"term": {"state": 1}}
]
}
}
}
相关文章