嗨,我正在尝试使用Elasticsearch在查询中使用模糊来创建“您的意思是”建议。例如,当用户搜索单词“ applo”时,它将改为显示“ apple”(因为存在包含单词apple的产品/品牌名称)。因此,我想突出显示模糊匹配的单词(“苹果”)并将其显示给用户。
这是我的财产
"properties": {
"brand_name": {
"type": "keyword",
"store": true
},
{
"product_name": {
"type": "keyword",
"store": true
},
}
这是我的查询
var should = { "should": [
{
"multi_match": {
"fields": ["product_name", "brand_name"],
"query": "applo",
"fuzziness": 2,
"prefix_length": 1
}
},
{
"query_string": {
"query": "*" + applo + "*",
"fields": ["product_name", "brand_name"]
}
}
],
"minimum_should_match": 1
};
body = {
size: 50,
from: 0,
query: {
bool: should
},
aggs: buildAggregate(),
"highlight": {
"fields": {
"brand_name": {},
"product_name": {}
}
}
};
模糊和查询工作正常,并给出正确的结果。但是,结果中没有突出显示字段。我的查询中缺少什么,或者映射属性有什么变化?
数据示例:
{ took: 67, timed_out: false, _shards: { total: 5, successful: 5,
skipped: 0, failed: 0 }, hits: { total: 2, max_score: null, hits: [
[Object] ] }, aggregations: { brands:
{ doc_count_error_upper_bound: 0,
sum_other_doc_count: 0,
buckets: [Array] },
minimum: { value: 1000 },
maximum: { value: 1000 },
values:
{ doc_count_error_upper_bound: 0,
sum_other_doc_count: 0,
buckets: [Array] } } }
点击对象:
{ _index: 'product', _type: 'product', _id: '1', _score: null, _source: { product_name: 'Apple Watch', brand_name: 'Apple' } }
答案 0 :(得分:0)
开始吧:
"properties": {
"brand_name": {
"type": "text"
},
"product_name": {
"type": "text"
}
}
此更改之后,您失去了在这些字段上运行聚合的功能。这是思考的重点。因为:如果使用字段数据,则会损失性能,并增加存储量。
最后,我建议将查询简化为query_string:
{
"query": {
"query_string": {
"query": "applo~1"
}
}
}
了解此查询here。