如何在弹性搜索中使用两个不同的分析器索引字段

时间:2016-11-27 19:26:25

标签: elasticsearch

假设我有一个字段“productTitle”,我想让我的用户搜索产品。

我还想申请自动填充功能。所以我使用带有以下过滤器的autocomplete_analyzer:

   "autocomplete_filter": {
        "type":     "edge_ngram",
        "min_gram": 2,
        "max_gram": 10
    }

然而,在用户进行搜索的同时,我不希望应用“edge_ngram”,因为它会产生大量不相关的结果。

例如,当用户想要搜索“mi”并开始输入“m”,“mi”时......他们应该得到以m,mi作为自动完成选项的结果。但是,当他们实际进行查询时,他们应该只获得带有“mi”一词的结果。目前他们也看到了“迷你”等的结果。

因此,是否可以使用两种不同的分析仪对“productTitle”进行索引?多字段类型是我的选择吗?

编辑:productTitle的映射

 "productTitle" : {
                "type" : "string",
                "index_analyzer" : "second",
                "search_analyzer" : "standard",
                "fields" : {
                  "raw" : {
                    "type" : "string",
                    "index" : "not_analyzed"
                  }
                }
              }

, “第二”分析仪

"analyzer": {
        "second": {
            "type":      "custom",
            "tokenizer": "standard",
            "filter":   [
                "lowercase",
                "trim",
                "autocomplete_filter"
            ]
        }

所以当我查询:

  "filtered" : {
    "query" : {
      "match" : {
        "productTitle" : {
          "query" : "mi",
          "type" : "boolean",
          "minimum_should_match" : "2<75%"
        }
      }
    }
  }

我也得到像"mini"这样的结果。但我只需要获得包括"mi"

在内的结果

谢谢

2 个答案:

答案 0 :(得分:2)

嗯...据我所知,没有办法为同一个领域应用多个分析仪......你可以做的是使用&#34;多字段&#34;。 这里是一个如何为&#34;子场应用不同分析器的示例&#34;: https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html#_multi_fields_with_multiple_analyzers

答案 1 :(得分:0)

在您的答案中阻止您所描述内容的正确方法是在字段映射中指定analyzersearch_analyzer,如下所示:

"productTitle": {
    "type": "string",
    "analyzer": "autocomplete_analyzer",
    "search_analyzer": "standard"
}

自动填充analyzer将在编制索引时启动,并根据您的edge_ngram配置对您的标题进行标记,standard分析器将在搜索时启动而不会应用edge_ngram的东西。

在此上下文中,除非您需要以不同方式对productTitle字段进行标记,否则不需要多字段。