elasticsearch Elasticsearch-使用同义词检查查询中是否包含文档,elasticsearch,lucene,fuzzy-search,synonym,elasticsearch,Lucene,Fuzzy Search,Synonym" /> elasticsearch Elasticsearch-使用同义词检查查询中是否包含文档,elasticsearch,lucene,fuzzy-search,synonym,elasticsearch,Lucene,Fuzzy Search,Synonym" />

elasticsearch Elasticsearch-使用同义词检查查询中是否包含文档

elasticsearch Elasticsearch-使用同义词检查查询中是否包含文档,elasticsearch,lucene,fuzzy-search,synonym,elasticsearch,Lucene,Fuzzy Search,Synonym,我想构建一个应用程序,其中匹配要求文档中的每个令牌至少包含在查询中一次 请注意,这与标准预期不同。因此,文档现在相当小,而查询可能非常长。例如: 文件: "elastic super cool". 有效的查询匹配将是 "I like elastic things since elasticsearch is super cool" 我设法从弹性搜索中获得匹配令牌的数量(另请参见)。 因此,在上面的示例中,3个匹配(=文档长度)表示查询匹配 但是我怎样才能把它和同义词结合起来呢 假设“酷”的同

我想构建一个应用程序,其中匹配要求文档中的每个令牌至少包含在查询中一次

请注意,这与标准预期不同。因此,文档现在相当小,而查询可能非常长。例如:

文件:

"elastic super cool".
有效的查询匹配将是

"I like elastic things since elasticsearch is super cool"
我设法从弹性搜索中获得匹配令牌的数量(另请参见)。 因此,在上面的示例中,3个匹配(=文档长度)表示查询匹配

但是我怎样才能把它和同义词结合起来呢

假设“酷”的同义词是“好”、“棒”和“好”。通过使用同义词标记过滤器,我成功地将同义词添加到文档中的每个位置

因此,对于上述查询,以下四个文档各有3个令牌匹配:

"elastic super nice"

"elastic nice cool"

"nice good great"

"good great cool"
但只有第一个匹配是有效匹配

尽管每个同义词匹配在文档中表示相同的标记,但如何避免将其视为一个匹配

有什么办法解决这个问题吗

我读到percolators可能会解决这个问题,但我仍然不确定percolators是否会以我想要的方式处理同义词


想法?

我想你应该扩展一下同义词。您可以使用脚本来计算匹配的位置

我将他的脚本改编为本地脚本,返回0到1之间的数字作为字段中匹配位置的比率。我对其进行了一些调整,使其只匹配每个查询的一个位置

您需要一个包含职位数量的字段,例如,通过使用实际统计职位数量的字段

@覆盖
公共对象运行()
{
IndexField IndexField=this.indexLookup().get(字段);
Long numberOfPositions=((ScriptDocValues.Longs)doc().get(positionsField)).getValue();
ArrayList位置=新的ArrayList();
for(字符串术语:术语)
{
迭代器termPos=indexField.get(term,IndexLookup.FLAG_位置| IndexLookup.FLAG_缓存)
.iterator();
while(termPos.hasNext())
{
int position=术语位置next().位置;
if(位置。包含(位置))
{
继续;
}
职位。添加(职位);
//如果术语匹配多个位置,则只应计算新位置
打破
}
}
返回位置。大小()*1.0/numberOfPositions;
}
您可以在查询中将其用作函数\分数脚本

{
“功能评分”:{
“查询”:{
“匹配”:{
“信息”:“我喜欢弹性的东西,因为elasticsearch超级酷”
}
},
“脚本_分数”:{
“参数”:{
“条款”:[
“我”,
“像”,
“弹性”,
“事情”,
“自”,
“弹性搜索”,
“是”,
“超级”,
“酷”
],
“字段”:“消息”,
“位置字段”:“消息位置计数”
},
“lang”:“native”,
“脚本”:“匹配的位置和比率”
},
“增压模式”:“更换”
}
}
然后,您可以将“min_score”设置为1,并仅获取与给定字段中的所有位置匹配的文档


我希望这个解决方案就是您所需要的。

您能解决这个问题吗?你试过Percolator和同义词过滤器吗?这似乎是一个常见的用例。现在是否有更好的(现成的)方法来处理这个问题,或者我们只需要使用本机脚本解决方案?