Elastic Search中的自动完成匹配

托比亚斯·爱德华兹

所以我有一个的identifier弹性搜索包含类似值串场D123M1T23等。

我试图建立自动完成进入搜索这一领域,使得查询D12可能匹配D12D120D121,...,D1210等等。

目前,我已经构建了一个自定义的边缘ngram过滤器和分析器,如下所示:

"filter": {
  "autocomplete_filter": {
    "type": "edgeNGram",
    "min_gram": 2,
    "max_gram": 10
  }
}

"analyzer": {
  "autocomplete": {
      "type": "custom",
      "tokenizer": "whitespace",
      "filter": {"lowercase", "autocomplete_filter"}
  }
}

索引中,我identifier索引字段上使用它

"identifier": {
  "type": "string",
  "analyzer": "autocomplete",
  "search_analyzer": "standard"
}

这意味着,被索引为n元语法D1234D1D12D123D1234

要查询这个我做如下:

"query": {
  "bool": {
    "should": {
      "match": {
        "identifier": {
          "query": "D12",
          "fuzziness": 0
        }
      }
    }
  }
}

该结果从最长到最短返回,因此D12出现在结果的结尾。如何确保尽可能短的标识符具有最高的相关性评分?

我的猜测是D12查询像这样匹配ngram:[{D12}, {D12}3, {D12}34]弹性搜索变为“哦,太好了,三个匹配项!” 而不是1[{D12}]D12结果会给。

我猜一个解决方案可能不是部分匹配这些ngram,因此弹性搜索可以看到[{D12}]两个结果,但是排名D12更高,D1234因为它匹配了ngram的1/2,而不是1/4。我不确定如何配置弹性搜索以给出此结果。

任何帮助将非常感激。

金坛沙阿25

您可以使用基于脚本的排序来完成此操作,但首先需要像这样映射identifier字段multi-fields

"identifier": {
    "type": "string",
    "analyzer": "autocomplete",
    "search_analyzer": "standard",
    "fields": {
        "raw": {
            "type": "string",
            "index": "not_analyzed"
        }
    }
}

你需要这样做,因为如果你sort直接上identifier,那么你会得到相同的结果,因为他们都将是具有2个字母标记edge ngram filter之后,这将给您想要的结果

{
  "query": {
    "bool": {
      "should": {
        "match": {
          "identifier": {
            "query": "D12",
            "fuzziness": 0
          }
        }
      }
    }
  },
  "sort": {
    "_script": {
      "script": "doc['identifier.raw'].value.length()",
      "order": "asc",
      "type": "number"
    }
  }
}

希望这可以帮助!!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章