【问题标题】:Elasticsearch - match not_analyzed field with partial search termElasticsearch - 将 not_analyzed 字段与部分搜索词匹配
【发布时间】:2017-07-16 00:55:37
【问题描述】:

我的弹性搜索索引中有一个"name" field - not_analyzed

假设"name" field 的值为"some name"。我的问题是,如果我想要匹配搜索词 - some name some_more_name someother name,因为它包含 some name,那么 not_analyzed 是否允许匹配发生,如果没有,那么我怎样才能得到匹配的建议搜索词?

【问题讨论】:

    标签: performance search elasticsearch


    【解决方案1】:

    在索引期间,name 字段的文本存储在倒排索引中。如果分析此字段,则 2 个术语将进入倒排索引:somename。但由于没有分析,只存储了1个词:some name 在搜索期间(使用匹配查询),默认情况下您的搜索查询会被分析和标记化。所以会有几个术语:somenamesome_more_namesomeother。然后 Elasticsearch 将查看倒排索引,以查看搜索查询中是否至少有一个词。但是只有some name这个词,所以你不会在结果集中看到这个文档。
    您可以使用 _analyze 端点使用分析器

    回到您的问题,如果您想获得建议的搜索查询的匹配项,则必须分析您的字段。

    如果您还需要保留未分析的版本,您应该使用multi fields

    PUT my_index
    {
      "mappings": {
        "my_type": {
          "properties": {
            "name": {
              "type": "keyword",
              "fields": {
                "analyzed": { 
                  "type": "text"
                }
              }
            }
          }
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      Taras 已经解释清楚了,我的问题可能已经解决了,但是如果你不能改变你的索引的映射,你可以使用查询(我在 5.4 ES 中测试过)

      GET test/_search
      {
        "query": {
          "query_string": {
            "default_field": "namekey",
            "query": "*some* *name*",
            "default_operator": "OR"
          }
        }
      

      【讨论】:

      猜你喜欢
      • 2014-02-05
      • 2013-09-11
      • 2021-12-13
      • 2016-01-07
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      相关资源
      最近更新 更多