查询匹配模式标记

时间:2018-02-07 14:47:26

标签: elasticsearch elasticsearch-5

假设我们有一个搜索查询吸尘器WSP 6666 C 22 C 2 KW橡胶我们希望与我们的索引匹配。索引产品中有:

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

现在我希望将这两个类别匹配为modelnumber

{
  "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"
                }
              }
          }
     }
}

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

  • 真空
  • 清洁器
  • WSP
  • 666666
  • C
  • 22
  • C
  • 2
  • KW

有没有一种可能的方式使用令牌器,它只能找到匹配?:

  • 吸尘器
  • WSP 6666 C 22 C 2 KW

正如您所看到的,并非所有正则表达式都具有相同的格式,因此无法使用正则表达式标记器。

2 个答案:

答案 0 :(得分:1)

处理此问题的正确方法是使用(edge-)ngrams索引数据。但在此之前,您可能希望尝试使用与您关注的字段匹配的{ "query": { "multi_match": { "query": "Vacuum cleaner WSP 6666 C 22 C 2 KW rubber", "fields": [ "categories", "modelnumbers" ] } } } 查询:

sed

答案 1 :(得分:0)

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