文章目录
- 一,110-全文检索-ElasticSearch-进阶-两种查询方式
- 二,111-全文检索-ElasticSearch-进阶-QueryDSL基本使用&match_all
- 三,112-全文检索-ElasticSearch-进阶-match全文检索
- 四,113-全文检索-ElasticSearch-进阶-match_phrase短语匹配
- 五,114-全文检索-ElasticSearch-进阶-multi_match多字段匹配
一,110-全文检索-ElasticSearch-进阶-两种查询方式
Elasticsearch两种基本的检索方式使用Elasticsearch REST API的说明:
-
使用REST request URI发送搜索参数:
这种方式是通过GET请求将查询参数附加在URL上。这适用于简单的查询,并且可以很容易地在浏览器中测试。例如,上面的查询示例:GET bank/_search?q=*&sort=account_number:asc
GET
是HTTP方法,用于请求从服务器获取资源。bank
是索引的名称。_search
是一个特殊的端点,用于执行搜索查询。q=*
是查询参数,*
表示搜索所有文档。sort=account_number:asc
指定了排序方式,这里按照account_number
字段升序排序。
-
使用REST request body发送搜索参数:
这种方式是通过POST请求发送一个JSON格式的请求体。它提供了更复杂的查询能力,并且可以包含多个查询参数和选项。例如,上面的查询示例:POST bank/_search {"query": {"match_all": {}},"sort": [{"account_number": {"order": "desc"}}] }
POST
是HTTP方法,通常用于向服务器提交要被处理的数据。bank/_search
同样指定了索引和搜索端点。- 请求体中的
"query": { "match_all": {} }
定义了一个查询,match_all
查询将匹配所有文档。 "sort"
数组定义了排序规则,这里指定了按照account_number
字段降序排序。
两种方式的主要区别在于查询的复杂性和灵活性。使用URI的方式简单直观,适合快速测试和简单的查询。使用请求体的方式则更适合复杂的查询,可以包含更多的选项和参数。
二,111-全文检索-ElasticSearch-进阶-QueryDSL基本使用&match_all
GET bank/_search
{"query": {"match_all": {}},"sort": [{"balance": {"order": "desc"}}],"from": 5,"size": 5,"_source": ["balance", "firstname"]
}
-
GET bank/_search
:这是HTTP请求的开始,其中GET
是请求方法,bank
是索引的名称,_search
是执行搜索查询的端点。 -
"query": {
:定义查询的开始。 -
"match_all":()
:这是一个查询子句,match_all
查询会匹配所有文档。括号()
在这里应该是空的,因为match_all
查询不需要任何参数。 -
'sort": [
:这个部分看起来像是一个语法错误,因为sort
关键字后面紧跟着一个单引号'
,这可能是一个复制粘贴错误。正确的应该是"sort": {
,用于定义排序规则。 -
"balance":
:这是排序规则的一个字段,表示按照balance
字段进行排序。 -
"orden": "desc"
:指定排序的顺序,"desc"
表示降序排序。 -
"from": 5,
:定义从结果的哪个位置开始返回,这里设置为5,意味着从第6个结果开始返回。 -
"size": 5,
:定义返回结果的数量,这里设置为5,意味着返回5个结果。 -
_source": ["balance","firstname"]
:定义返回的源字段,这里指定返回balance
和firstname
字段的值。
这个查询会从bank
索引中检索所有文档,按照balance
字段降序排序,跳过前5个结果,然后返回接下来的5个结果,并且只返回每个结果的balance
和firstname
字段。
三,112-全文检索-ElasticSearch-进阶-match全文检索
match query是一种模糊匹配,查询时会将关键词进行分词处理,然后基于倒排索引进行匹配,对于匹配到的结果进行打分,返回结果按照评分进行排序。
如下查询。
GET bank/_search
{"query": {"match": {"address": "mill"}}
}
这个查询同样是针对Elasticsearch的"bank"索引的一个搜索请求,使用match
查询来执行全文搜索。
-
GET bank/_search
: 这表示使用HTTP GET方法发起请求,目的是对"bank"索引进行搜索。 -
"query"
: 这部分定义了搜索的查询条件。 -
"match"
: 这是Elasticsearch中用于执行全文搜索的查询类型,它会在指定的字段上进行搜索。 -
"address"
: 这是要搜索的字段名称,即文档中的"address"字段。 -
"Mill road"
: 这是搜索的关键词,查询会寻找"address"字段中包含"Mill road"这个确切短语的文档。
匹配查询有两种可能:
-
完全匹配: 文档的"address"字段完全包含"Mill road"这个短语,例如:“123 Mill road”。
-
部分匹配: 搜索关键词"Mill road"会被分词为"mill"和"road",如果"address"字段包含"Mill"和"road",就会被匹配到,如"198 Mill Lane"或"263 Aviation Road"。
查询结果显示,一共有32个文档被匹配,每个结果都有评分,最高评分是8.926605,返回结果默认按照评分降序排序。显然,评分最高的是与搜索关键词匹配度最高的文档。
四,113-全文检索-ElasticSearch-进阶-match_phrase短语匹配
match_phrase
和match
类似,都是在指定的字段中进行全文搜索,不同的是match_phrase
要匹配整个短语中所有的词,match
匹配单个词就算命中,match_phrase
查询还关注词的顺序和位置,它返回的是那些在指定字段中包含整个短语的文档。
以下是match_phrase
查询的一些关键点:
-
短语匹配:
match_phrase
会寻找包含整个短语的文档,而不是单独的词。 -
词序: 它匹配的是短语中词的顺序,即短语中的词必须按照指定的顺序出现。
-
位置敏感: 短语中的词之间可以有其他词,但它们必须在短语中指定的顺序内。
-
使用场景: 当你需要搜索包含特定短语的文档时,比如搜索包含完整地址或名称的文档,
match_phrase
是一个很好的选择。 -
性能: 由于
match_phrase
查询需要考虑词的顺序和位置,它可能比match
查询在性能上要慢一些。 -
分析器: 与
match
查询一样,match_phrase
也受到字段使用的分析器的影响。不同的分析器可能会影响搜索结果。 -
语法:
match_phrase
查询的语法与match
类似,但是它更专注于短语的完整性和顺序。
这里是一个使用match_phrase
查询的示例:
GET bank/_search
{"query": {"match_phrase": {"address": "Mill Road"}}
}
在这个示例中,查询会寻找"address"字段中包含"Mill Road"这个确切短语的文档,并且词的顺序和大小写都需要匹配。如果"address"字段包含"Mill Road",但是顺序或大小写不同,或者两个词中间有其他词,那么这些文档将不会被匹配。
五,114-全文检索-ElasticSearch-进阶-multi_match多字段匹配
multi_match
查询允许在多个字段上执行相同的搜索查询,只要一个字段匹配,这条记录就会被命中。
下面是一个使用multi_match
查询的示例:
GET bank/_search
{"query": {"multi_match": {"query": "Albemarle","fields": ["address", "firstname"]}}
}
在这个示例中,查询会在address
、firstname
字段上搜索包含"Albemarle"的文档。如果这些字段中的任何一个包含这个短语,文档就可能被返回在搜索结果中。
如下,firstname
包含Albemarle
,address
中不包含Albemarle
,但文档也会被命中。