我有一个multi_match类型的cross_fields查询,我想通过前缀匹配来改进它。

{
  "index": "companies",
  "size": 25,
  "from": 0,
  "body": {
    "_source": {
      "include": [
        "name",
        "address"
      ]
    },
    "query": {
      "filtered": {
        "query": {
          "multi_match": {
            "type": "cross_fields",
            "query": "Google",
            "operator": "and",
            "fields": [
              "name",
              "address"
            ]
          }
        }
      }
    }
  }
}

它与google mountain view等查询完全匹配。此处有filtered数组,因为我需要动态添加地理位置过滤器。
{
  "id": 1,
  "name": "Google",
  "address": "Mountain View"
}

现在,我想允许前缀匹配,而不会破坏cross_fields

此类查询应匹配:
  • goog
  • google mount
  • google mountain vi
  • mountain view goo

  • 如果我将multi_match.type更改为phrase_prefix,则它与单个字段匹配整个查询,因此它仅与mountain vi匹配,而不与google mountain vi匹配

    我该如何解决?

    最佳答案

    由于没有答案,可能有人看到了,所以我遇到了同样的问题,这是一个解决方案:

    使用the edgeNGrams tokenizer

    您需要更改索引设置和映射。

    这是设置的示例:

    "settings" : {
      "index" : {
        "analysis" : {
          "analyzer" : {
            "ngram_analyzer" : {
              "type" : "custom",
              "stopwords" : "_none_",
              "filter" : [ "standard", "lowercase", "asciifolding", "word_delimiter", "no_stop", "ngram_filter" ],
              "tokenizer" : "standard"
            },
            "default" : {
              "type" : "custom",
              "stopwords" : "_none_",
              "filter" : [ "standard", "lowercase", "asciifolding", "word_delimiter", "no_stop" ],
              "tokenizer" : "standard"
            }
          },
          "filter" : {
            "no_stop" : {
              "type" : "stop",
              "stopwords" : "_none_"
            },
            "ngram_filter" : {
              "type" : "edgeNGram",
              "min_gram" : "2",
              "max_gram" : "20"
            }
          }
        }
      }
    }
    

    当然,您应该根据自己的使用情况调整分析仪。您可能想要保持默认分析器不变或将ngram过滤器添加到它,这样就不必更改映射。最后一种解决方案将意味着索引中的所有字段都将获得ngram过滤器。

    对于映射:
    "mappings" : {
      "patient" : {
        "properties" : {
          "name" : {
            "type" : "string",
            "analyzer" : "ngram_analyzer"
          },
          "address" : {
            "type" : "string",
            "analyzer" : "ngram_analyzer"
          }
        }
      }
    }
    

    使用ngram_analyzer声明要自动完成的每个字段。
    然后,您的问题中的查询应该起作用。如果您使用其他东西,我很乐意听到。

    关于elasticsearch - Elasticsearch multi_match cross_fields前缀,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28652375/

    10-13 07:52