查询匹配模式分词器

Query match pattern tokeniser

假设我们有一个搜索查询 Vacuum cleaner WSP 6666 C 22 C 2 KW rubber,我们希望将其与我们的索引进行匹配。的索引产品是:

...
"categories": [
    "Vacuum cleaner",
    "Blender",
],
"modelnumbers": [
    "WSP 6666 C 22 C 2 KW",
    "ABST 23",
    "2h28f7h2i3f",
]

现在我想匹配两个类别作为型号

{
  "query": {
      "function_score": {
        "query": {
          "bool": {
            "should": [
              {
                "query_string": {
                  "query": "Vacuum cleaner WSP 6666 C 22 C 2 KW rubber",
                  "default_operator": "OR",
                  "default_field": "categories",
                  "boost": "10"
                }
              },
              {
                "query_string": {
                  "query": "Vacuum cleaner WSP 6666 C 22 C 2 KW rubber",
                  "default_operator": "OR",
                  "default_field": "modelnumbers",
                  "boost": "10"
                }
              }
          }
     }
}

这显示了正确的结果。但是现在它匹配以下所有内容:

是否有一种使用分词器的方法可以只找到匹配项?:

如您所见,并非所有正则表达式都具有相同的格式,因此不可能使用正则表达式标记器。

处理此问题的正确方法是使用 (edge-)ngrams 对数据进行索引。但在执行此操作之前,您可能想尝试使用与您关心的字段匹配的 multi_match 查询:

{
  "query": {
    "multi_match": {
      "query": "Vacuum cleaner WSP 6666 C 22 C 2 KW rubber",
      "fields": [
        "categories",
        "modelnumbers"
      ]
    }
  }
}

遵循 Val 的建议,并查看 cross_fields 多匹配查询。您稍后可以使用 DisMax 或 Bool 查询改进您的查询(DisMax 查询实际上是一个 bool 查询)。