我在Elastic Search中为包含数组的文档编制索引。
示例文件:
doc1:
{
...
actors: ["Tom Cruise", "Brad Pitt", ...],
...
}
doc2:
{
...
actors: ["Brad Pitt", "Tom Cruise", ...],
...
}
在这些文档中搜索时,我希望得分取决于数组中的匹配位置,这意味着在示例文档中,搜索“Tom Cruise”应该会提升第一个文档doc1
,因为它匹配职位是1
。
我现在能想到的唯一解决方案是添加包含第一个演员的有限数量的字段(例如5个字段),并添加提升,例如:
doc1:
{
...
actors: ["Tom Cruise", "Brad Pitt", ...],
actor1: "Tom Cruise",
actor2: "Brad Pitt",
...
}
actor1
提升5
,actor2
4
,等等。
您是否有更好的解决方案来处理它,可能使用custom_score
?
谢谢!
答案 0 :(得分:1)
鉴于此
curl -XPOST localhost:9200/films
curl -XPOST localhost:9200/films/film/1 -d'{
actors: ["Tom Cruise", "Brad Pitt", "Patrick Stewart", "Christopher Walken"]
}'
curl -XPOST localhost:9200/films/film/2 -d'{
actors: ["Brad Pitt", "Patrick Stewart", "Tom Cruise", "Christopher Walken"]
}'
然后这个查询
{
"query":{
"custom_score":{
"query": {"match_all":{}},
"script":"length = _source.actors.size();
found = false; index=0;
while(!found && index<length){
if(_source.actors[index] == target){
found=true;
}
else{
index+=1
}
}
length - index;",
"params":{
"target": "Tom Cruise"
}
}
}
}
计算第一部电影的分数为4分,最后一部影片的分数为2分(如果你将其粘贴到卷曲中,我必须删除自定义脚本中的所有换行符)
一些警告:
length - offset
作为分数,因此您只能真正比较相同长度的内容doc.actors
(即索引数据)只有一个按字母顺序排序的数组版本,这显然没用,所以我不得不使用_source
,我认为这个版本要慢得多。如果custom_score查询包装已过滤的查询,则在性能方面可能是可接受的。