Elasticsearch深入搜索—全文搜索

目录

第1关:Elasticsearch匹配查询

代码

第2关:Elasitcsearch组合查询

代码


第1关:Elasticsearch匹配查询

任务描述
本关任务:顾客想要找出一本讲述三国时期的历史,或者具有反抗,斗争的书籍。请你帮他找出来。

相关知识
为了完成本关任务,你需要掌握:

匹配查询;
多词匹配查询。
基于词项与基于全文
所有查询会或多或少的执行相关度计算,但不是所有查询都有分析阶段。 和一些特殊的完全不会对文本进行操作的查询(如 bool 或 function_score )不同,文本查询可以划分成两大家族:基于词项的查询和基于全文的查询。

基于词项的查询
如 term 或 fuzzy 这样的底层查询不需要分析阶段,它们对单个词项进行操作。用 term 查询词项 Foo 只要在倒排索引中查找准确词项,并且用算法为每个包含该词项的文档计算相关度评分 _score 。记住 term 查询只对倒排索引的词项精确匹配,这点很重要,它不会对词的多样性进行处理(如 foo 或 FOO )。这里,无须考虑词项是如何存入索引的。如果是将 ["Foo","Bar"] 索引存入一个不分析的(keyword)包含精确值的字段,或者将 Foo Bar 索引到一个带有 whitespace 空格分析器的字段,两者的结果都会是在倒排索引中有 Foo 和 Bar 这两个词。

基于全文的查询
像 match 或 query_string 这样的查询是高层查询,它们了解字段映射的信息:如果查询日期(date)或整数(integer)字段,它们会将查询字符串分别作为日期或整数对待。如果查询一个(keyword)分析的精确值字符串字段,它们会将整个查询字符串作为单个词项对待。但如果要查询一个(text)已分析的全文字段,它们会先将查询字符串传递到一个合适的分析器,然后生成一个供查询的词项列表。一旦组成了词项列表,这个查询会对每个词项逐一执行底层的查询,再将结果合并,然后为每个文档生成一个最终的相关度评分。

我们很少直接使用基于词项的搜索,通常情况下都是对全文进行查询,而非单个词项,这只需要简单的执行一个高层全文查询(进而在高层查询内部会以基于词项的底层查询完成搜索)。

匹配查询
匹配查询 match 是个核心查询。无论需要查询什么字段,match 查询都应该会是首选的查询方式。它是一个高级全文查询,这表示它既能处理全文字段,又能处理精确字段。

这就是说, match 查询主要的应用场景就是进行全文搜索,我们以下面一个简单例子来说明全文搜索是如何工作的:

首先,我们使用 bulk API 创建一些新的文档和索引:

curl -H "Content-Type: application/json" -XPOST 'http://127.0.0.1:9200/my_index/my_type/_bulk?pretty' --data-binary @a.json
a.json 内容:

{ "index": { "_id": 1 }}
{ "title": "The quick brown dog" }
{ "index": { "_id": 2 }}
{ "title": "The quick brown fox jumps over the lazy dog" }
{ "index": { "_id": 3 }}
{ "title": "The quick jumps fox jumps over the quick dog" }
{ "index": { "_id": 4 }}
{ "title": "Brown fox jumps dog" }
我们用第一个示例来解释使用 match 查询搜索全文字段中的单个词:

curl -H "Content-Type: application/json" -XGET 'http://localhost:9200/my_index/my_type/_search?pretty' -d '{
    "query": {
        "match": {
            "title": "Jumps"
        }
    }
}'
Elasticsearch 执行上面这个 match 查询的步骤是:

检查字段类型;
标题 title 字段是一个 text 类型已分析的全文字段,这意味着查询字符串本身也应该被分析。

分析查询字符串;
将查询的字符串 Jumps 传入标准分析器中,输出的结果是单个项 jumps 。因为只有一个单词项,所以 match 查询执行的是单个底层 term 查询。

查找匹配文档;
用 term 查询在倒排索引中查找 jumps 然后获取一组包含该项的文档,本例的结果是文档:2、3 和 4。

为每个文档评分。
用 term 查询计算每个文档相关度评分 _score ,这是种将词频(即词 quick 在相关文档的 title 字段中出现的频率)和反向文档频率(即词 quick 在所有文档的 title 字段中出现的频率),以及字段的长度(即字段越短相关度越高)相结合的计算方式。

{
...
"hits" : {
  "max_score" : 0.39556286,
  "hits" : [
    {
      "_id" : "3",
      "_score" : 0.39556286,
      "_source" : {
        "title" : "The quick jumps fox jumps over the quick dog"
      }
    },
    {
      "_id" : "4",
      "_score" : 0.21636502,
      "_source" : {
        "title" : "Brown fox jumps dog"
      }
    },
    {
      "_id" : "2",
      "_score" : 0.15753464,
      "_source" : {
        "title" : "The quick brown fox jumps over the lazy dog"
      }
    }
  ]
}
}
文档 3 最相关,因为它的 jumps 出现了两次,也占据了内容的一大部分;文档 4 比 文档 2 更具相关性,因为在文档 4 占据的内容更大。

多词查询
如果我们一次只能搜索一个词,那么全文搜索就会不太灵活,幸运的是 match 查询让多词查询变得简单:

curl -H "Content-Type: application/json" -XGET 'http://localhost:9200/my_index/my_t

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小柒_02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值