【发布时间】:2016-01-05 06:50:35
【问题描述】:
所以我在弹性搜索中有一个identifier 字符串字段,其中包含D123、M1、T23 等值。
我正在尝试在此字段的搜索中构建自动完成功能,以便 D12 的查询可能匹配 D12、D120、D121、...、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"
}
这意味着为D1234 编制索引的ngram 是D1、D12、D123 和D1234。
要查询这个我做如下:
"query": {
"bool": {
"should": {
"match": {
"identifier": {
"query": "D12",
"fuzziness": 0
}
}
}
}
}
这会从最长到最短返回结果,因此D12 会出现在结果的末尾。我将如何确保最短的标识符具有最高的相关性分数?
我的猜测是D12 查询与 ngram 匹配,如下所示:[{D12}, {D12}3, {D12}34] 和弹性搜索“哦,太好了,3 个匹配!”而不是 D12 结果将给出的 1 [{D12}]。
我猜一种解决方案可能没有部分匹配这些 ngram,因此弹性搜索会看到 [{D12}] 的两个结果,但排名 D12 高于 D1234,因为它匹配 ngram 的 1/2 而不是 1/4。我不确定如何配置弹性搜索来给出这个结果。
任何帮助将不胜感激。
【问题讨论】:
-
你用的是什么版本的ES?
-
解决方案有效吗?
-
嘿伙计,对不起,我还没有机会实现它并自己尝试一下。它会适用于其他
bool条件还是会覆盖这些条件? -
没问题,我几乎可以肯定它可以在不同的布尔条件下工作,但是如果您可以发布完整的查询,我可以对其进行测试并确保 100%
-
它很酷的芽,我很快就会看看它
标签: search elasticsearch autocomplete full-text-search search-engine