想象一下我有一些文档,这些值包含在名为name
的文本字段中
abc xyz group
group x/group y
group 1, group 2, group 3, group 4
现在想像一下,我正在向ES发送一个简单的匹配查询来查询术语“组”:
{
"query": {
"match": {
"name": "group"
}
}
}
我希望得到的结果是,无论该术语出现的频率,出现的位置等等,所有3个文档都将以相同的分数返回。
现在,我已经知道我可以做到这一点,方法是将match
用constant_score
包裹起来,就像这样:
{
"query": {
"constant_score": {
"filter": {
"match": {
"name": "group"
}
},
"boost": 1
}
}
}
但是,说我现在想使用搜索词abc group
进行查询。在这种情况下,我想发生的是Document2和Document3将返回相同的分数(匹配group
),但是Document1具有更好的分数,因为它同时匹配abc
和group
使用constant_score
包裹我的match
查询后,包含任何术语的文档将返回相同的分数(即,文档{1、2和3对于abc group
返回相同的分数)。如果我删除constant_score
,则可能是文档3得分最高,因为它与搜索文本的匹配项更多(group
出现了4次)。
在constant_score
查询分析了我的搜索文本之后,似乎需要一种将match
查询移至的方法。有效地导致对abc group
的查询是两个constant_score
查询-一个查询abc
和一个查询group
。
有人知道实现这一目标的方法吗?
答案 0 :(得分:0)
我已经设法通过使用Elasticsearch的{{1}}令牌过滤器来解决此问题:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-unique-tokenfilter.html
我已将其添加到索引映射的unique
字段中,它看起来是在检索所需的结果而不必担心name
。
但是请注意,所有这一切都是为了消除术语频率对constant_score
的影响-其他指标(例如_score
)仍然会对结果产生影响。因此,这并不等同于我在问题中假设的使用fieldLength
的后分析版本,但这足以满足我当前的要求。