提升弹性[MoreLikeThis]搜索查询以匹配数组开头

7

我有类似以下结构的弹性搜索文档:

{
    "name": "item1",
    "storages": [
       {"items": ["a", "b", "c", "d", "e", "f"]}, 
       {"items": ["a 1", "b 2", "c 3", "d 4", "e 5", "f 6"]}]
}

{
    "name": "item2",
    "storages": [
       {"items": ["d", "e", "f", "g", "h", "i", "j"]}, 
       {"items": ["d 4", "e 5", "f 6", "g 7", "h 8", "i 9", "j 10"]}
    ]
}

我想要搜索字符串序列,例如 ["d 4","e 5"]。为此,我使用MoreLikeThis查询:

{
    "query": {
        "more_like_this" : {
            "fields" : ["storages.items"],
            "like" :  ["d 4","e 5"],
            "min_term_freq": 1,
            "min_doc_freq": 1
        }
    }
}

它几乎可以正常工作,但是对于第一个文档返回"_score": 0.1620518,对于第二个文档返回"_score": 0.13890153。

我想要提高数组('items')开头的词项得分,因此因为"d 4"、"e 5"在数组开头出现,所以应该排名更高。

有没有办法在elasticsearch中创建这样的查询?也许它不应该像这个查询那样?

棘手的部分是查询可能类似于["d 4","e 5","xxx"](xxx不在文档中出现,但没关系)

1个回答

1

如您在此处相关问题的答案中所见,

数组被索引为多值字段,这些字段是无序的,因此在搜索时不能保证顺序。

更糟糕的是,对象数组并不是按您想象的那样存储

对象数组的工作方式并不像您期望的那样:您无法查询数组中每个对象而不独立于其他对象。如果需要能够这样做,则应使用嵌套数据类型而不是对象数据类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接