我正在尝试实现一个Elasticsearch查询,该查询将根据查询的字段返回突出显示的不同结果。
我知道ES最初并不支持这一点,并且大多数人都对像facet这样的聚合功能感到满意。但由于我需要的数据多于方面所能提供的数据,而且突出显示是该项目的关键,我一直在寻找替代解决方案。
我正在使用Tire gem进行Rails项目,到目前为止这是我的策略:
使用突出显示在一个部分上查询弹性搜索查询字符串,在另一部分上查询搜索
{
"query": {
"match": {
"name": {
"query": "Banana",
"analyzer": "query_analyzer",
"operator": "AND"
}
}
},
"facets": {
"group_by": {
"terms": {
"fields": [
"name"
],
"size": 10,
"all_terms": false
}
}
},
"highlight": {
"fields": {
"name": {}
},
"pre_tags": [
"<span class=\"highlight\">"
],
"post_tags": [
"</span>"
]
},
"size": 100
}
使用查询结果中的第一个匹配元素交叉引用唯一结果,不仅可以检索缺失的信息,还可以检查结果的突出显示。
这种方法的问题在于,即使我将查询结果限制为初始结果大小的十倍,交叉引用最终也可能无法在查询中找到10个唯一结果。
此外,如果我忽略查询并将facet结果与我的数据库交叉引用,我将失去亮点。
我也在想,也许我甚至可以第二次以不同的方式索引我的数据来强制服务器端的唯一性,但事实证明这是另一个挑战。
我现在的想法已经不多了,所以如果有人看到我错过的东西,我会非常感激任何帮助。
修改
举个例子,假设我有这些文件在ES
中编入索引[
{
id: 1,
name: 'Banana',
countryOfOrigin: 'Banana land'
},
{
id: 2,
name: 'Banana',
countryOfOrigin: 'Candy mountain'
},
{
id: 3,
name: 'Carrot',
countryOfOrigin: 'United Kingdom'
},
{
id: 4,
name: 'Barrel',
countryOfOrigin: 'Canada'
}
]
我以与上述查询相同的方式搜索“Ba”,我期望找到类似的东西:
{
"_shards":{
/* ... */
},
"hits":{
"total" : 2,
"hits" : [
{
"_index" : "my_index",
"_type" : "my_type",
"_id" : "1",
"_source" : {
"id": '1',
"name": 'Banana',
"countryOfOrigin": 'Banana land'
}
"highlight": {
"name": ["<span class='highlight'>Ba</span>nana"]
}
},
{
"_index" : "my_index",
"_type" : "my_type",
"_id" : "4",
"_source" : {
"id": '4',
"name": 'Barrel',
"countryOfOrigin": 'Canada'
}
"highlight": {
"name": ["<span class='highlight'>Ba</span>rrel"]
}
}
]
}
}
这基本上允许我在我的记录中搜索不同的项目名称。