нечеткость в запросе bool с множественным поиском - PullRequest
0 голосов
/ 21 ноября 2018

Я использую Elassearch версии 6.3.0.Я хочу использовать нечеткость наряду с multimatch.но нет варианта для этого.Кто-нибудь может дать мне решение?Заранее спасибо Запрос:

    {   "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 голосов
/ 21 ноября 2018

Глядя на ваш существующий запрос, вы ищете сочетание

  • Повышение на основе поля
  • Совпадение в нескольких полях
  • Соответствие фраз
  • Нечеткое совпадение

Если это не 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: 0 и in_order:true позволило бы мне сопоставить фразы для слов, которые я указал в предложениях.

Дайте мне знать, если у вас есть какие-либо вопросы.

0 голосов
/ 21 ноября 2018

Что заставляет вас думать, что в запросе с несколькими совпадениями нет опции нечеткости?

Например, с данными ниже:

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, я получу три результата.

...