对键入的短语进行弹性搜索映射、索引和自动完成查询



这是我的ES数据的样子:

"boqList" : [ 
{
"particulars" : "Excavation ",
"quantity" : 1500,
"unit" : "m3",
"rate" : 500,
"amount" : 750000
}, 
{
"particulars" : "Providing & laying Rubble Soling",
"quantity" : 300,
"unit" : "m2",
"rate" : 450,
"amount" : 135000
}, 
{
"particulars" : "Providing & laying PCC M10",
"quantity" : 30,
"unit" : "m2",
"rate" : 650,
"amount" : 19500
}, 
{
"particulars" : "Providing & Laying Reinforcement With Cutting, Bending & Binding With Binding Wire Etc Complete.",
"quantity" : 50,
"unit" : "M.T.",
"rate" : 80000,
"amount" : 4000000
}, 
{
"particulars" : "Providing & Making Double Scaffolding",
"quantity" : 350,
"unit" : "m2",
"rate" : 150,
"amount" : 52500
}, 
...

我用于索引和映射数据的 NodeJS 代码如下所示:

client.indices.create({
index: "boqs",
body: {
settings: {
index: {
analysis: {
filter: {},
analyzer: {

edge_ngram_analyzer: {
filter: ["lowercase"],
tokenizer: "edge_ngram_tokenizer"
},
edge_ngram_search_analyzer: {
tokenizer: "lowercase"
}
},
tokenizer: {
edge_ngram_tokenizer: {
type: "edge_ngram",
min_gram: 2,
max_gram: 5,
token_chars: ["letter"]
}
}

}
}
},

mappings: {

properties: {
boqList: {
properties: {
amount: {
type: "long"
},
particulars: {
type: "text",
fields: {
edgengram: {
type: "text",
analyzer: "edge_ngram_analyzer",
search_analyzer: "edge_ngram_search_analyzer"
}
},
analyzer: "standard"
},
quantity: {
type: "long"
},
rate: {
type: "long"
},
unit: {
type: "text",
fields: {
keyword: {
type: "keyword",
}
}
}
}
},
projectId: {
type: "text",
fields: {
keyword: {
type: "keyword",
}
}
}
}

},
},
}, function(err,resp,respcode){
console.log(err,resp,respcode);
})

我也像这样索引我的数据:

http://localhost:9200/boqs/_doc/3
{
"projectId" : "ABCD",
"boqList" : [ 
{
"particulars" : 
{
"input" : ["Providing & laying Rubble Soling"]
},
"quantity" : 300,
"unit" : "m2",
"rate" : 450,
"amount" : 135000
}
]
}

我试图使用 Edge NGram 方法在我的 boqList 的"细节"字段上实现自动完成,并将响应作为 JSON 发送到我的前端 React。

目前,当我尝试查询任何内容时,我没有得到任何点击。

http://localhost:9200/boqs/_search

http://localhost:9200/boqs/_search
{
"query": {
"multi_match": {
"query": "Providing",  
"type": "phrase", 
"fields": "boqList.particulars"
}
}
}

我希望即使在"细节"字段中也能对短语执行自动完成。 我错过了什么吗?我对 Elasticsearch 比较陌生,因此任何帮助将不胜感激。谢谢!

看看生成的分析令牌,看看你的edge_ngrams_analyzeredge_ngrams_search_analyzer如何处理文本"提供和铺设瓦砾索林"。 (免责声明:该链接指向我创建的 WIP 分析调试工具(。 有一个 inquisitor elasticsearch 插件对于此类实例可能更可靠。

一些额外的提示:

  • 您的max_gram设置仅设置为 5,这意味着为"提供"用户搜索生成的最长令牌是"provi",它将与仅使用lowercase标记器"提供"生成的搜索时间令牌不匹配。
  • Elasticsearch 有一个完成建议器,它可以帮助您避免遇到具有较低级别详细信息的尽可能多的墙壁 - 请参阅完成建议器
  • 这是一篇关于为自动完成提供支持主题的综合文章: https://medium.com/@mourjo_sen/a-detailed-comparison-between-autocompletion-strategies-in-elasticsearch-66cb9e9c62c4 - 这似乎涵盖了您的 ngrams 分析方法和建议器方法

最新更新