elasticsearch:或运算符,匹配数

时间:2017-12-22 16:26:04

标签: elasticsearch

使用运算符"或"是否可以根据匹配数对我的搜索进行评分?

目前查询如下所示:

"query": {
  "function_score": {
    "query": {
      "match": {
        "tags.eng": {
        "query": "apples banana juice",
        "operator": "or",
        "fuzziness": "AUTO"
        }
      }
    },
    "script_score": {
      "script": # TODO
    },
    "boost_mode": "replace" 
  }
}

我不想使用"和"操作员,因为我想要包含"苹果汁的文件"可以找到,以及仅包含" juice"等的文档。但是,包含这三个单词的文档应该得分高于包含两个单词或单个单词的文档,依此类推。

我在这里找到了一个可能的解决方案https://github.com/elastic/elasticsearch/issues/13806 它使用bool查询。但是,我不知道如何访问由分析仪生成的令牌(在此示例中:苹果,香蕉,果汁)。

任何帮助?

1 个答案:

答案 0 :(得分:0)

根据上面的讨论,我提出了以下解决方案,这与我提出问题时的想象有点不同,但适合我的情况。

首先,我定义了一个新的相似度:

"settings": {
        "similarity": {
            "boost_similarity": {
                "type": "scripted",
                "script": {
                    "source": "return 1;"
                }
            }
        }
...
}

然后我遇到了以下问题: “苹果香蕉汁”的查询对于带有标签[“apple juice”,“apple”]和另一个带有标签[“banana”,“apple juice”]的doc的文档具有相同的分数。虽然我想把第二个得分更高。 从this other discussion我发现这个问题是因为我有一个嵌套字段引起的。我创建了一个通常的文本字段来解决它。

但我也想区分带有标签的文档[“apple”,“banana”,“juice”]和带有标签[“apple banana juice”]的另一个doc(同一标签中的所有三个单词)。因此,最终的解决方案是为我的标签保留两个字段(嵌套和文本字段)。

最后,查询包含带有两个should子句的bool查询:第一个should子句在文本字段上执行并使用“或”运算符。第二个should子句在嵌套字段上执行,并使用和“和运算符”

尽管我找到了针对此特定问题的解决方案,但在使用ES搜索标记文档时,我仍然面临一些其他问题。在搜索全文时,文档中的示例似乎运行良好。但有人知道我在哪里可以找到更具体的标记文件吗?