【问题标题】:Search multiple fields with "and" operator (but use fields' own analyzers)使用“and”运算符搜索多个字段(但使用字段自己的分析器)
【发布时间】:2013-08-09 11:46:57
【问题描述】:

ElasticSearch 版本:0.90.2

问题是:我想在索引中找到文档,以便它们:

  1. 在多个字段中匹配所有查询标记
  2. 使用自己的分析器的字段

所以如果有 4 个文档:

{ "_id" : 1, "name" : "Joe Doe",     "mark" : "1", "message" : "Message First" }
{ "_id" : 2, "name" : "Ann",         "mark" : "3", "message" : "Yesterday Joe Doe got 1 for the message First"}
{ "_id" : 3, "name" : "Joe Doe",     "mark" : "2", "message" : "Message Second" }
{ "_id" : 4, "name" : "Dan Spencer", "mark" : "2", "message" : "Message Third" }

查询是“Joe First 1”,它应该找到 ids 1 和 2。也就是说,它应该找到包含搜索查询中所有标记的文档,无论它们在哪个字段中(可能所有标记都在一个字段中,或者每个令牌都在自己的字段中)。

一种解决方案是使用elasticsearch“_all”字段功能:这样它将我需要的所有字段(名称、标记、消息)合并为一个,我将能够使用类似的东西来查询它

"match": {
  "_all": {
    "query": "Joe First 1",
    "operator": "and"
  }
}

但这样我只能为“_all”字段指定分析器。而且我需要“名称”和“消息”字段来拥有不同的标记器/标记过滤器集(假设名称将具有语音分析器,而消息将具有一些词干标记过滤器)。

有没有办法做到这一点?

【问题讨论】:

    标签: lucene elasticsearch


    【解决方案1】:

    感谢 elasticsearch 小组的人,这是解决方案...非常简单需要说:)

    我需要做的就是使用 query_string 查询 http://www.elasticsearch.org/guide/reference/query-dsl/query-string-query/ 和 default_operator = AND,它就可以解决问题:

    {
      "query": {
        "query_string": {
          "fields": [
            "name",
            "mark",
            "message"
          ],
          "query": "Joe First 1",
          "default_operator": "AND"
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      我认为在这里使用multi match query 是有意义的。比如:

      "multi_match": {
          "query": "Joe First 1",
          "operator": "and"
          "fields": [ "name", "message", "mark"]
      }
      

      【讨论】:

      • 我突然想到,我不太确定 ElasticSearch 在这里产生了什么。也就是说,不确定这是否会得到name:(+joe +first +1) message:(+joe +first +1) mark:(+joe +first +1),或者它是否会生成类似:+(name:joe message:joe mark:joe) +(name:first message:first mark:first) +(name:1 message:1 mark:1)。后者是这里所需要的,前者需要在同一字段中找到所有内容,这可能是文档所暗示的。
      • 不幸的是,这个不起作用,因为它为每个字段生成 AND 查询(您的评论中的前者)。
      • 目前我唯一想到的是将查询拆分为客户端的术语(我知道标记器会做得更好,但我可以忍受一些不准确)并进行如下查询: "query_string": { "fields": [ "name", "mark", "message" ], "query": "Joe AND First AND 1" }
      【解决方案3】:

      正如您所说,您可以将analyzer(或search_analyzer/index_analyzer)设置为用于_all 字段。在我看来,这确实应该是您实现所需查询结果的第一步。

      来自http://jontai.me/blog/2012/10/lucene-scoring-and-elasticsearch-_all-field/,我们有这个美味的报价:

      ... _all 字段从其他字段复制文本并进行分析 再次他们;它不会复制预先分析的令牌。你可以设置一个 _all 字段的单独分析器。

      我的解释是您应该设置您的_all 分析器以及单个字段分析器。 _all 字段不会重新分析单个字段数据;它将抓取原始字段内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-21
        • 1970-01-01
        • 1970-01-01
        • 2014-09-03
        • 1970-01-01
        • 2017-07-09
        相关资源
        最近更新 更多