node.js - EdgeNgram autocomplete_filter 对前缀搜索有意义吗?
问题描述
我有大约 100 万条记录的弹性搜索索引。
我想对弹性搜索索引、名称和 ID 中的 2 个字段进行多前缀搜索(总共大约 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
,那么如果你的 min gram 是 1 并且 max gram 是 20,它将被标记为l, lo, lon, etc..
这里的好处是即使你搜索bridge
or anytokens 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
or上进行搜索id
,则最好完成提示。当完成建议器处理所有索引时,上下文建议器根据上下文处理特定索引。
正如您所说,您可以完成前缀搜索。你提到有 10 个这样的字段。如果您知道要在最前面建议的领域,那么您可以选择上下文建议器。
中间词的完成建议- 我使用了这个解决方案,它就像魅力一样。
您可以参考文档以获取建议器中可用的其他默认选项。
推荐阅读
- python - 使用 pypdf 跳过受密码保护的文件(仅支持算法代码 1 和 2)
- spring - 在 Spring 中,将自定义属性放入默认的 application.properties/yaml 文件中是一种好习惯吗?
- nginx - kubernetes nginx 上游服务器作为服务未找到
- google-apps-script - 如何使用 Google 脚本在 Google 表格中添加超链接
- c# - 如何防止从命名空间内访问类?
- javascript - js递归函数输出题,函数栈
- python-3.x - AttributeError:dlsym(RTLD_DEFAULT,Error_GetLastErrorNum):找不到符号
- linux - 使用 nslookup 检查 dns 记录以获取主机名
- laravel - 在 laravel 中使用中间件保护路由
- wpf - WPF 添加菜单与标题栏一致