【问题标题】:Match query internals on stemmed word search - Elastic在词干搜索中匹配查询内部结构 - Elastic
【发布时间】:2015-08-19 19:18:17
【问题描述】:

给定以下查询:

 match: {"title": "proportions"}

对于使用词干分析器分析标题字段的文档:

Doc 1 title: proportion

Doc 2 title: proportions

将返回两个文档。

查询在内部是这样执行的:

"bool":{
      "should": [{"term" : {"title" : "proportions}}]

 }

如果是这样,根词“比例”的匹配发生在哪里?我试图了解根词在管道中的匹配位置。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    实际上,这不是内部执行查询的方式。 TermMatch 查询在一些方面有所不同,但要记住的最重要的一点是,Term 查询会在倒排索引中准确搜索指定的查询文本,而 Match 查询使用 any 分析器分析查询文本使用的字段,然后使用这些值来搜索倒排索引。

    让我们看一个例子,使用英语词干分析器。

    我制作了一个名为 my_analyzer (like in the docs) 的英语词干过滤器:

    PUT
    {
       "settings": {
          "analysis": {
             "analyzer": {
                "my_analyzer": {
                    "type":"custom",
                   "tokenizer": "whitespace",
                   "filter": [
                      "my_stemmer"
                   ]
                }
             },
             "filter": {
                "my_stemmer": {
                   "type": "stemmer",
                   "name": "english"
                }
             }
          }
       }
    }
    

    接下来我为我的词干分析器定义一个映射,只需一个名为 value 的简单字段即可:

    PUT _mapping/test
    {
         "properties": {
            "value": {
               "type": "string",
               "analyzer": "my_analyzer"
            }
         }
    }
    

    现在,让我们索引两个文档,

    PUT{"value":"proportion"}
    PUT{"value":"proportions"}
    

    当我们执行以下查询时,您认为会发生什么?仅供参考,您可以将此处的“比例”更改为“比例”以获得相同的结果。

    "query": {
          "bool": {
             "should": [{
                   "term": {"value": {"value": "proportion"}}
                }]
          }
       }
    
    "hits": {
      "total": 0,
      "max_score": null,
      "hits": []
    }
    

    没有结果。这很重要,因为我们直接在倒排索引中搜索“比例”,结果为空。这实际上是因为“比例”或“比例”这两个词不在我们的倒排索引中。里面有什么?让我们来了解一下:

    "tokens": [
      {
         "token": "proport",
         "start_offset": 0,
         "end_offset": 11,
         "type": "word",
         "position": 1
      }
    ]
    

    只有单词proport 在索引中。如果您修改上面的布尔查询以使用文本proport,那么您将获得两个文档。当您像这样使用匹配查询时:

    "query": {
        "match": {
           "value": "proportions"
        }
    }
    

    您实际上是通过词干分析器运行“比例”,匹配查询在倒排索引中搜索“比例”,得到以下结果:

      "hits": [
         {
            "_index": "test",
            "_type": "test",
            "_id": "1",
            "_score": 0.30685282,
            "_source": {
               "value": "proportion"
            }
         },
         {
            "_index": "test",
            "_type": "test",
            "_id": "2",
            "_score": 0.30685282,
            "_source": {
               "value": "proportion"
            }
         }
      ]
    

    TLDR:词条查询在倒排索引中准确查找您提供的内容,而匹配查询在倒排索引中查找已分析的输出

    【讨论】:

    • 哇,太棒了!非常好表达和简洁!非常感谢。
    • 我剩下的唯一查询是我对在 Elastic 文档中读到的内容感到困惑:“到目前为止,您可能已经意识到多词匹配查询只是将生成的术语查询包装在 bool 查询中”因此为什么我在内部认为它使用术语查询,不是这样吗?
    • 他们将分析的令牌包装在术语查询中!所以match 使用术语布尔查询查找词干词proport
    • 啊,我刚刚经历了那个灯泡时刻,我看到它是术语查询中使用的“已分析标记”!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2017-03-02
    • 2017-08-07
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多