弹性搜索edge_ngram问题?

时间:2016-10-06 11:23:29

标签: elasticsearch solr lucene

我为一个档案配置了edge_ngram。

假设在edge_ngram中索引的单词是:快速

及其分析为: q,qu,qui,quic,quick

当我想搜索 quickfull 时,快速的字样也会出现在结果中。

我想要只包含 quickfull 的单词,否则它不会产生结果。

这是我的映射:

{
  "john_search": {
    "aliases": {},
    "mappings": {
      "drugs": {
        "properties": {
          "chemical": {
            "type": "string"
          },
          "cutting_allowed": {
            "type": "boolean"
          },
          "id": {
            "type": "long"
          },
          "is_banned": {
            "type": "boolean"
          },
          "is_discontinued": {
            "type": "boolean"
          },
          "manufacturer": {
            "type": "string"
          },
          "name": {
            "type": "string",
            "boost": 2,
            "fields": {
              "exact": {
                "type": "string",
                "boost": 4,
                "analyzer": "standard"
              },
              "phenotic": {
                "type": "string",
                "analyzer": "dbl_metaphone"
              }
            },
            "analyzer": "autocomplete"
          },
          "price": {
            "type": "string",
            "index": "not_analyzed"
          },
          "refrigerated": {
            "type": "boolean"
          },
          "sell_freq": {
            "type": "long"
          },
          "xtra_name": {
            "type": "string"
          }
        }
      }
    },
    "settings": {
      "index": {
        "creation_date": "1475061490060",
        "analysis": {
          "filter": {
            "my_metaphone": {
              "replace": "false",
              "type": "phonetic",
              "encoder": "metaphone"
            },
            "autocomplete_filter": {
              "type": "edge_ngram",
              "min_gram": "3",
              "max_gram": "100"
            }
          },
          "analyzer": {
            "autocomplete": {
              "filter": [
                "lowercase",
                "autocomplete_filter"
              ],
              "type": "custom",
              "tokenizer": "standard"
            },
            "dbl_metaphone": {
              "filter": "my_metaphone",
              "tokenizer": "standard"
            }
          }
        },
        "number_of_shards": "1",
        "number_of_replicas": "1",
        "uuid": "qoRll9uATpegMtrnFTsqIw",
        "version": {
          "created": "2040099"
        }
      }
    },
    "warmers": {}
  }
}

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

这是因为您的姓名字段为autocomplete,这意味着quickfull分析器也会在搜索时应用,因此搜索字词q将被标记为qu },quiquicquickquickfquickfuquickfulquickfullquick以及也匹配"search_analyzer": "standard"

为了防止这种情况发生,您需要在name字段上设置 "name": { "type": "string", "boost": 2, "fields": { "exact": { "type": "string", "boost": 4, "analyzer": "standard" }, "phenotic": { "type": "string", "analyzer": "dbl_metaphone" } }, "analyzer": "autocomplete", "search_analyzer": "standard" <--- add this }, 以覆盖索引时间分析器。

{{1}}