0

我在 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的提升。5actor2 4

你有更好的解决方案来处理这个问题,也许使用custom_score

谢谢 !

4

1 回答 1

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(如果您将其粘贴到 curl 中,我必须删除自定义脚本中的所有换行符)

一些警告:

  • 您可能想要一种将偏移量转换为分数的更好方法:此代码返回length - offset分数,因此您只能真正比较相同长度的事物
  • 看起来doc.actors(即索引数据)只有一个按字母顺序排序的数组版本,这显然没有用,所以我不得不使用_source它,我认为它要慢得多。如果 custom_score 查询包装了过滤后的查询,则在性能方面可能是可以接受的。
于 2012-06-06T23:48:06.420 回答