1

我有一个关于 ElasticSearch 查询的问题。我有一个名为“名称”的字段,它是使用语音插件中的分析器定义的。

  "name" : {
      "type" : "string",
      "store" : "yes",
      "index" : "analyzed",
      "analyzer" : "soundsAnalyzer",
      "boost" : 10.0
  },

到目前为止一切正常!但是我在这个字段上有一个特定的查询,我想获得完全匹配而不是类似的听起来匹配。我试图通过使用术语查询和文本查询来实现这一点。术语查询根本不返回任何结果,我不知道为什么。通过使用文本查询并定义另一个分析器,我也一无所获。我尝试了以下查询:

{
  "query": {
    "text": {
      "documents.name": {
        "query": "England",
        "analyzer": "plainAnalyzer"
      }
    }
  }
}

所以我的问题是,我怎样才能避免映射中定义的分析器只是为了这个特定的查询来获得精确匹配?TIA

4

1 回答 1

1

您将不得不对该字段进行两次索引 - 一次使用soundsAnalyzer,另一次使用plainAnalyzer. 您可以使用multi_field类型实现此目的:

"name" : {
    "type" : "multi_field",
    "fields" : {
        "name" : {"type" : "string", "store" : "yes", "index" : "analyzed", "analyzer" : "soundsAnalyzer", "boost" : 10.0},
        "plain" : {"type" : "string", "index" : "analyzed", "analyzer" : "plainAnalyzer"}
    }
}

所有当前正在使用的查询soundsAnalyzer将保持不变。在需要plainAnalyzer您可以使用的查询中,name.plain而不是name

{
  "query": {
    "text": {
      "documents.name.plain": {
        "query": "England"
      }
    }
  }
}
于 2013-04-03T14:12:34.657 回答