【问题标题】:Elasticsearch: Query avoiding defined analyzer / using another analyzerElasticsearch:查询避免定义的分析器/使用另一个分析器
【发布时间】:2013-04-03 13:46:27
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: elasticsearch


    【解决方案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"
          }
        }
      }
    }
    

    【讨论】:

    • 非常感谢@imotov 的快速回复。所以我理解你的意思,我必须使用这种方法存储我的数据两次(...)嗯,它实际上是很多数据:)
    • 不,数据仍会存储一次,但会以两种不同的方式进行索引。
    • 它就像一个魅力,但在附件方面我有点挣扎。它应该是相似的还是我必须复制整个附件声明? (这是我当前的解决方法)简单地将字段更改为我存储二进制数据的 multi_field 不起作用。这意味着,二进制数据被写入两个字段,但查询仅适用于与附件具有相同名称的字段。再次感谢。
    • 不确定我是否关注。你能举个例子说明什么有效,什么无效?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 2014-08-08
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多