多匹配弹性搜索在布尔查询中的模糊性

时间:2018-11-21 07:29:26

标签: elasticsearch elasticsearch-6

我正在使用Elasticsearch 6.3.0版。我想同时使用模糊度和多重匹配。但这是没有选择的。有人可以给我解决方案吗?提前致谢 查询:

    {   "query": {
        "bool": {
          "must": [
            {"function_score": {
              "query": {
                "multi_match": {
                  "query": "local",
                  "fields": [
                      "user.name^3", 
                      "main_product"
                    ],
                    "type": "phrase"
                }
              }
            }}
          ], 
          "filter": {
            "geo_distance": {
              "distance": "1000km",

              "user.geolocation": {
                "lat": 25.55,
                "lon": -84.44
              }
            }
          }
        }   
} }

2 个答案:

答案 0 :(得分:2)

查看现有查询,您正在寻找

的组合
  • 基于字段的提升
  • 多场比赛
  • 词组匹配
  • 模糊匹配

如果不是phrase_match,则只需在现有查询中添加"fuzziness": "AUTO""fuzziness":1 or whatever number based on your requirement即可获得所需的内容。

没有短语的模糊

POST <your_index_name>/_search
{  
   "query":{  
      "bool":{  
         "must":[  
            {  
               "function_score":{  
                  "query":{  
                     "multi_match":{  
                        "query":"local",
                        "fields":[  
                           "user.name^3",
                           "main_product"
                        ],
                        "fuzziness":"AUTO"
                     }
                  }
               }
            }
         ],
         "filter":{  
            "geo_distance":{  
               "distance":"1000km",
               "user.geolocation":{  
                  "lat":25.55,
                  "lon":-84.44
               }
            }
         }
      }
   }
}

短语模糊:

在这种情况下,您需要使用Span Queries

为了简单起见,我放弃了过滤部分,并提出了以下查询。假设我正在搜索名为pearl jam的短语。

POST <your_index_name>/_search
{  
   "query":{  
      "function_score":{  
         "query":{  
            "bool":{  
               "should":[  
                  {  
                     "bool":{  
                        "boost":3,
                        "must":[  
                           {  
                              "span_near":{  
                                 "clauses":[  
                                    {  
                                       "span_multi":{  
                                          "match":{  
                                             "fuzzy":{  
                                                "user.name":"pearl"
                                             }
                                          }
                                       }
                                    },
                                    {  
                                       "span_multi":{  
                                          "match":{  
                                             "fuzzy":{  
                                                "user.name":"jam"
                                             }
                                          }
                                       }
                                    }
                                 ],
                                 "slop":0,
                                 "in_order":true
                              }
                           }
                        ]
                     }
                  },
                  {  
                     "bool":{  
                        "boost":1,
                        "must":[  
                           {  
                              "span_near":{  
                                 "clauses":[  
                                    {  
                                       "span_multi":{  
                                          "match":{  
                                             "fuzzy":{  
                                                "main_product":"pearl"
                                             }
                                          }
                                       }
                                    },
                                    {  
                                       "span_multi":{  
                                          "match":{  
                                             "fuzzy":{  
                                                "main_product":"jam"
                                             }
                                          }
                                       }
                                    }
                                 ],
                                 "slop":0,
                                 "in_order":true
                              }
                           }
                        ]
                     }
                  }
               ]
            }
         }
      }
   }
}

因此,我正在基于模糊匹配的多字段词组中的字段执行增强操作,该词组称为pearl jam

具有slop: 0in_order:true将使我能够对从句中指定的单词进行词组匹配。

让我知道您是否有任何疑问。

答案 1 :(得分:0)

什么使您认为多重匹配查询上没有模糊性的选择?

例如,使用以下数据:

http://localhost:9200/question_1/doc/_bulk
{"index":{}}
{"name" : "John Lazy", "text": "lazzi"}
{"index":{}}
{"name" : "John Lassi", "text": "lasso"}
{"index":{}}
{"name" : "Joan Labbe", "text": "lazzy"}

此查询:

http://localhost:9200/question_1/_search
{
  "query": {
    "multi_match" : {
      "query" : "lazi",
      "fields" : [ "name", "text" ],
      "fuzziness": 1
    }
  }
}

然后我得到一个结果,但是如果将fuzziness参数更改为2,我将得到三个结果。