如何解决EdgeNGram autocomplete_filter对前缀搜索有意义吗?
我有大约100万条记录的弹性搜索索引。
我想对弹性搜索索引中的2个字段,名称和ID(总共约10个)进行多前缀搜索。
创建EdgeNGram自动完成过滤器是否完全有意义?
或者我错过了EdgeNGram的要点。
这是我用于创建索引的代码:
client.indices.create({
index: 'testing',// type: 'text',body: {
settings: {
analysis: {
filter: {
autocomplete_filter: {
type: 'edge_ngram',min_gram: 3,max_gram: 20
}
},analyzer: {
autocomplete: {
type: 'custom',tokenizer: 'standard',filter: [
'lowercase','autocomplete_filter'
]
}
}
}
}
}
},function(err,resp,status) {
if(err) {
console.log(err);
}
else {
console.log("create",resp);
}
});
搜索代码
client.search({
index: 'testing',type: 'article',body: {
query: {
multi_match : {
query: "87041",fields: [ "name","id" ],type: "phrase_prefix"
}
}
}
},function (error,response,status) {
if (error){
console.log("search error: "+error)
}
else {
console.log("--- Response ---");
console.log(response);
console.log("--- Hits ---");
response.hits.hits.forEach(function(hit){
console.log(hit);
})
}
});
搜索返回正确的结果,所以我的问题是在这种情况下创建edgengram过滤器和分析器有意义吗?
还是可以直接使用此前缀功能?
非常感谢您的信息
解决方法
这取决于您的用例。让我解释一下。
-
您可以将
ngram
用于此功能。假设您的数据为london bridge
,那么如果您的最小克数为1,最大克数为20,则将其标记为l,lo,lon,etc..
这样做的好处是,即使您搜索bridge
或任何tokens which is part of the generated ngrams
,它们也会被匹配。 -
有一个
out of box feature completion suggester
。它使用FST模型存储它们。甚至文档说it is faster to search but costlier to build
。但是认为是prefix suggester
。意味着搜索bridge
默认不会带来london bridge
。但是有一些方法可以使这项工作。要解决的方法是拥有令牌数组。这里的london bridge
和bridge
是令牌。 -
还有一个叫
context suggester
的名字。如果您知道要在name
或id
上进行搜索,则最好是在完成提示上。当完成提示器处理所有索引时,上下文建议器根据上下文对特定索引进行处理。
正如您所说,这是前缀搜索,您可以进行补全。您提到了10个这样的字段。而且,如果您知道要在最前面建议的字段,那么您可以去找上下文建议器。
one nice answer about edge ngram and completion
completion suggester for middle of the words-我使用了此解决方案,它的作用就像魅力。
您可以参考文档中建议程序中可用的其他默认选项。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。