我使用的是Elasticsearch 8.6,我试图在全文搜索中提升文档,其中字段的值正好包含在查询文本中,换句话说,其中字段正好是查询的子字符串。
例如,假设我有这些文档:
{
"id": 1,
"title": "Kids t-shirts",
"category": "Kids clothes"
},
{
"id": 2,
"title": "All about kids",
"category": ""
}
假设我根据title
字段搜索kids
,并且文档以#2,#1的顺序返回。到目前为止,这很好!
这就是我被卡住的地方:
如果查询***包含***category
的确切名称-例如blue kids clothes
,我想提升类别与查询匹配的文档-在本例中为#1。
我尝试过在category
字段上使用额外的match
或match_phrase
查询来提升,但是效果不好,例如,现在搜索kids
也会触发文档#1的提升,因为kids
和类别kids clothes
之间的匹配分数是正的。
完全匹配也不起作用--这是一种错误的方式。我希望blue kids clothes
基于类别kids clothes
是查询的完全子串来触发boost,但完全匹配只会在查询完全是kids clothes
时才会触发boost。
为了澄清,以下是我希望触发提升的一些情况:
| 查询文本|#1是否应该增加文档?|
| --------------|--------------|
| 童装|是(类别与查询完全匹配)|
| 蓝色童装|是(具体类别包含在查询中)|
| 儿童|否(不完全匹配)|
| 儿童服装|否(类别中的两个词都在查询中,但顺序错误=没有完全匹配)|
(Doc#2永远不应该被提升,因为它的category
字段是空的)
任何建议或指导将非常感谢!
1条答案
按热度按时间jogvjijk1#
我能够做到这一点的一种方法是使用自定义
script_score
:很高兴听到其他答案!