这就是我的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的'specific'字段上实现自动完成,并将响应作为JSON发送到我的前端React。
当前,当我尝试查询任何内容时,都没有获得任何点击。
http://localhost:9200/boqs/_search
OR
http://localhost:9200/boqs/_search
{
"query": {
"multi_match": {
"query": "Providing",
"type": "phrase",
"fields": "boqList.particulars"
}
}
}
我希望即使在“特殊信息”字段的中间也可以对短语执行自动完成。 有什么我想念的吗?我是Elasticsearch的新手,所以我们将不胜感激。谢谢!
答案 0 :(得分:0)
看看the analyzed tokens produced,看看您的edge_ngrams_analyzer
和edge_ngrams_search_analyzer
如何对待文本“提供和铺设碎石处理”。 (免责声明:链接指向我创建的WIP分析调试工具)。有一个查询器elasticsearch插件对于这种情况可能更可靠。
其他一些提示:
max_gram
设置仅设置为5,这意味着为“提供”用户搜索生成的最长令牌是“ provi”,这与仅由{{1}生成的搜索时间令牌不匹配}标记器“提供”。