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

У меня есть 4 разных отображения: A, B, C и D.

Для отображений A и B следующий запрос дает наилучшие результаты:

{
  "query": {
    "bool": {
      "should": [
          {
            "bool": {
              "must": [
                {
                  "multi_match": {
                    "query": "....",
                    "analyzer": "keyword",
                    "fuzziness": "AUTO",
                    "fields": ["name*"]
                  }
                }
              ]
            }
          }
      ]
    }
  },
  "from": 0,
  "size": 20
}

Для C следующий запрос дает наилучшие результаты:

{
  "query": {
    "bool": {
      "should": [
          {
            "bool": {
              "must": [
                {
                  "multi_match": {
                    "query": "....",
                    "analyzer": "simple",
                    "fuzziness": "AUTO",
                    "use_dis_max": false, 
                    "fields": ["name*"]
                  }
                }
              ]
            }
          }
      ]
    }
  }
}

И для D следующий запрос дает наилучшие результаты:

{

  "query": {
    "bool": {
      "should": [
          {
            "bool": {
              "must": [
                {
                  "multi_match": {
                    "query": "....",
                    "analyzer": "simple",
                    "fuzziness": 0,
                    "use_dis_max": false, 
                    "fields": ["name*"]
                  }
                },
                {
                  "multi_match": {
                    "query": "....",
                    "analyzer": "simple",
                    "fuzziness": 3,
                    "fields": ["name*"]
                  }
                }
              ]
            }
          }
      ]
    }
  }
} 

Я могу сделать 3 отдельных запроса и обработать результаты, но получается, что это грязно и занимает больше времени.Можно ли объединить эти 3 запроса в один и, скажем, для отображения / типов A и B использовать первое множественное совпадение, для C использовать второй, а для D использовать третий.

1 Ответ

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

Я придумал ниже, используя Тип запроса .

Ради простоты я рассмотрел запросы только для типов C и D, как упомянуто в вопросе.

Обратите внимание, что я также включил параметр boost и упомянул о нем таким образом, что документы типа C всегда будут иметь более высокие результаты по сравнению с документами типа D.

Вы можете пойти дальше и внести изменения в соответствии с вашими требованиями.

Запрос

POST <your_index_name>/_search
{  
   "query":{  
      "bool":{  
         "should":[  
            {  
               "bool":{  
                  "boost":100,
                  "must":[  
                     {  
                        "multi_match":{  
                           "query":"....",
                           "analyzer":"simple",
                           "fuzziness":"AUTO",
                           "use_dis_max":false,
                           "fields":[  
                              "name*"
                           ]
                        }
                     },
                     {  
                        "type":{  
                           "value":"C"
                        }
                     }
                  ]
               }
            },
            {  
               "bool":{  
                  "boost":5,
                  "must":[  
                     {  
                        "type":{  
                           "value":"D"
                        }
                     },
                     {  
                        "multi_match":{  
                           "query":"....",
                           "analyzer":"simple",
                           "fuzziness":0,
                           "use_dis_max":false,
                           "fields":[  
                              "name*"
                           ]
                        }
                     },
                     {  
                        "multi_match":{  
                           "query":"....",
                           "analyzer":"simple",
                           "fuzziness":3,
                           "fields":[  
                              "name*"
                           ]
                        }
                     }
                  ]
               }
            }
         ]
      }
   }
}

Дайте мне знать, если это поможет!

...