lucene/elasticsearch提供了复合标记/子标记的可能性。这是一个重要的特点,例如德语的合成词。lucene的默认行为是将subtokens与 OR
为了不损害召回和排除文件被退回。然而,在特定的情况下,要求的恰恰相反。
假设我要为以下两个文档编制索引:
文件1:
PUT /idxwith/_doc/1
{
"name": "stockfisch"
}
文件2:
PUT /idxwith/_doc/2
{
"name" : "laufstock"
}
这些词将分解如下:
stockfisch ==> stock, fisch
laufstock ==> lauf, stock
现在使用以下搜索查询:
POST /idxwith/_search
{
"query": {
"match": {
"name": {
"query": "stockfisch"
}
}
}
}
我只希望返回第一份文件,但事实并非如此。由于子项与 OR
,两个文档都将被返回(影响我搜索的准确性):
"hits" : [
{
"_index" : "idxwith",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.3287766,
"_source" : {
"name" : "stockfisch"
}
},
{
"_index" : "idxwith",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.241631,
"_source" : {
"name" : "laufstock"
}
}
]
我正在寻找关于如何调整lucene(或elastic)以使此行为可配置的提示,即能够定义子键与 AND
如有必要。
谢谢!
1条答案
按热度按时间xwmevbvl1#
要解决此问题,可以使用如下匹配短语查询:
短语查询以任意顺序将术语匹配到可配置的slop(默认为0)。换位术语的斜率为2。有关匹配短语的更多信息,请点击此处。
也可以在匹配查询中使用运算符,这意味着所有术语都应该在术语中,更多信息请参见此处。
在您的具体情况下,我认为匹配短语是一个更好的选择,因为术语的顺序很重要。