gpt4 book ai didi

lucene - Elasticsearch:每个位置只匹配一次

转载 作者:行者123 更新时间:2023-11-29 02:48:48 26 4
gpt4 key购买 nike

在我的 Elasticsearch 索引中,我的文档在同一位置有多个标记。

当我在每个位置至少匹配一个标记时,我想取回一份文档。 token 的顺序并不重要。我怎样才能做到这一点?我使用 Elasticsearch 0.90.5。

示例:

我索引这样的文档。

{
"field":"red car"
}

我使用同义词标记过滤器,在与原始标记相同的位置添加同义词。所以现在在这个领域,有2个职位:

  • 位置 1:“红色”
  • 位置 2:“汽车”、“汽车”

我目前的解决方案:

为了能够确保所有位置匹配,我也索引了最大位置。

{
"field":"red car",
"max_position": 2
}

我有一个自定义相似性,它从 DefaultSimilarity 扩展并返回 1 tf()、idf() 和 lengthNorm()。得到的分数是该字段中匹配项的数量。

查询:

{
"custom_score": {
"query": {
"match": {
"field": "a car is an automobile"
}
},
"_script": "_score*100/doc[\"max_position\"]+_score"
},
"min_score":"100"
}

我的解决方案有问题:

上面的搜索应该不匹配文档,因为查询字符串中没有标记“red”。但它是匹配的,因为 Elasticsearch 将 car 和 automobile 的匹配计算为两个匹配,并且给出的分数为 2,导致脚本分数为 102,满足“min_score”。

最佳答案

如果您需要保证 100% 匹配查询条件,您可以使用minimum_should_match。这是更常见的情况。


不幸的是,在您的情况下,您希望提供 100% 匹配的索引词。为此,您必须下降到 Lucene 级别并编写自定义 (java - here's boilerplate you can fork) 相似类,因为您需要访问未暴露给查询 DSL 的低级索引信息:

在查询评分器中扫描的每个文档/字段:

然后您的自定义相似性(您甚至可以扩展 DefaultSimilarity)将需要检测匹配项 <总项数 的查询,并将它们的分数乘以零。

由于查询和索引时间分析已经发生在这个评分级别,索引术语的总数将已经扩展到包括同义词,查询术语也应该如此,避免误报 “a car是汽车” 上面的问题。

关于lucene - Elasticsearch:每个位置只匹配一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21163884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com