更改lucene/elasticsearch中的复合令牌默认行为

ojsjcaue  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(1)|浏览(356)

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 如有必要。
谢谢!

xwmevbvl

xwmevbvl1#

要解决此问题,可以使用如下匹配短语查询:

POST /idxwith/_search
{
  "query": {
    "match_phrase": {
      "name": {
        "query": "stockfisch"
      }
    }
  }
}

短语查询以任意顺序将术语匹配到可配置的slop(默认为0)。换位术语的斜率为2。有关匹配短语的更多信息,请点击此处。
也可以在匹配查询中使用运算符,这意味着所有术语都应该在术语中,更多信息请参见此处。
在您的具体情况下,我认为匹配短语是一个更好的选择,因为术语的顺序很重要。

相关问题