1

我正在使用autocomplete_analyzer带有 filter的自定义分析器edgeNGram。所以映射看起来像:

  "acts_as_taggable_on_tags" : {
    "acts_as_taggable_on/tag" : {
      "properties" : {
        "name" : {
          "type" : "string",
          "boost" : 10.0,
          "analyzer" : "autocomplete_analyzer"
        }
      }
    }
  }

当我使用 搜索时query_string,它就像自动完成一样工作。例如,查询 "lon" 返回 ["lon", "long", "london",...]。

但有时我需要精确匹配。我怎样才能得到一个完全匹配的单词“lon”?我可以在进行搜索查询时使用其他分析器(例如simple或)吗?standard

4

1 回答 1

2

我认为您需要将数据存储在 2 个单独的字段中。一个将包含执行自动完成查询所需的令牌,另一个将包含完整的搜索查询。

如果您只有一个带有标记的字段,[lon, lond, londo, london]那么如果您搜索该字段,则不能说“请仅匹配标记london,因为这是完整的单词/最长标记”。

您可以使用多字段很好地完成 2 个字段。查看multi-field 上的 elasticsearch 文档。这部分的“官方”文档非常好,请查看!

我可能会这样做:

映射

"acts_as_taggable_on_tags" : {
  "acts_as_taggable_on/tag" : {
    "properties" : {
      "name" : {
        "type" : "multi_field",           
        "fields" : {
          "name" : {
            "type" : "string",
            "boost" : 10.0
          },
          "autocomplete" : {
            "type" : "string",
            "analyzer" : "autocomplete_analyzer",
            "boost" : 10.0
          }
        }
      }
    }
  }
}

查询

对于自动完成查询:

"query": {
  "query_string": {
    "query" : "lon",
    "default_field": "name.autocomplete"
  }
}

对于普通查询:

"query": {
  "query_string": {
    "query" : "lon",
    "default_field": "name"
  }
}

注意“default_field”的区别。

给出的另一个答案是行不通的;不同search_analyzer意味着对“伦敦”的搜索不会被标记为lon, lond, londo, london. 但这不会阻止从匹配名为“london”的文档中搜索“lon”,我认为这是您想要的。

于 2013-06-05T10:08:01.907 回答