2017-01-24 15 views
1

Объединить elasticsearch булева запроса с Диапазоном усилениемОбъединить elasticsearch Его запрос с усилением диапазона

У меня есть сложный запрос bool следующим образом. Я использую фальшивый поисковый запрос dgbdrtgndgfndrtgb, чтобы скомпоновать мой пример, который не должен соответствовать чему-либо.

{ 
    "from": 0, 
    "size": 10, 
    "query": { 
    "function_score": { 
     "boost_mode": "replace", 
     "query": { 
     "filtered": { 
      "filter": { 
      # ... 
      }, 
      "query": { 
      "bool": { 
       "should": [ 
       { 
        "match": { 
        "name.suggest_ngrams": { 
         "query": "dgbdrtgndgfndrtgb", 
         "fuzziness": "AUTO", 
         "prefix_length": 1, 
         "operator": "AND", 
         "boost": 10 
        } 
        } 
       }, 
       { 
        "multi_match": { 
        "query": "dgbdrtgndgfndrtgb", 
        "fields": [ 
         "name.untouched_lowercase" 
        ], 
        "boost": 5 
        } 
       }, 
       { 
        "query_string": { 
        "fields": [ 
         "name.suggest" 
        ], 
        "query": "dgbdrtgndgfndrtgb*", 
        "boost": 10 
        } 
       }, 
       { 
        "query_string": { 
        "fields": [ 
         "name.suggest" 
        ], 
        "query": "dgbdrtgndgfndrtgb", 
        "boost": 10 
        } 
       }, 
       { 
        "match": { 
        "first_word": { 
         "query": "dgbdrtgndgfndrtgb", 
         "operator": "AND", 
         "boost": 10 
        } 
        } 
       }, 
       { 
        "match": { 
        "name": { 
         "query": "dgbdrtgndgfndrtgb", 
         "operator": "AND", 
         "boost": 5 
        } 
        } 
       } 
       ] 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Это хорошо работает. Теперь для любого из этих совпадений я хочу добавить boost, где поле name имеет менее 2 слов. Другими словами, увеличивайте однословное совпадение или сортируйте их до вершины набора результатов.

Так что я попытался добавить range импульс, как это:

{ 
    "from": 0, 
    "size": 10, 
    "query": { 
    "function_score": { 
     "boost_mode": "replace", 
     "query": { 
     "filtered": { 
      "filter": { 
      # ... 
      }, 
      "query": { 
      "bool": { 
       "should": [ 
       { 
        "match": { 
        "name.suggest_ngrams": { 
         "query": "dgbdrtgndgfndrtgb", 
         "fuzziness": "AUTO", 
         "prefix_length": 1, 
         "operator": "AND", 
         "boost": 10 
        } 
        } 
       }, 
       { 
        "multi_match": { 
        "query": "dgbdrtgndgfndrtgb", 
        "fields": [ 
         "name.untouched_lowercase" 
        ], 
        "boost": 5 
        } 
       }, 
       { 
        "query_string": { 
        "fields": [ 
         "name.suggest" 
        ], 
        "query": "dgbdrtgndgfndrtgb*", 
        "boost": 10 
        } 
       }, 
       { 
        "query_string": { 
        "fields": [ 
         "name.suggest" 
        ], 
        "query": "dgbdrtgndgfndrtgb", 
        "boost": 10 
        } 
       }, 
       { 
        "match": { 
        "first_word": { 
         "query": "dgbdrtgndgfndrtgb", 
         "operator": "AND", 
         "boost": 10 
        } 
        } 
       }, 
       { 
        "match": { 
        "name": { 
         "query": "dgbdrtgndgfndrtgb", 
         "operator": "AND", 
         "boost": 5 
        } 
        } 
       }, 
       { 
        "range": { 
        "name.word_count": { 
         "lt": 2, 
         "boost": 40 
        } 
        } 
       }    
       ] 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Это сортирует вещи, как я хочу, но он также возвращает однословные матчи, которые не соответствуют поисковому запросу dgbdrtgndgfndrtgb.

Есть ли способ повысить только однословные совпадения, которые также соответствуют поисковому запросу? Я попытался понизить значение boost, которое разбивает желаемую сортировку при использовании действительного (найденного) условия поиска.

Похоже, что должен быть AND весь запрос bool с увеличением range. Я пробовал различные перестановки, чтобы добиться этого, не повезло, и документы менее полезны.

Одно предупреждение: я не могу использовать скрипты, поскольку индекс размещен на AWS, который не поддерживает его.

Любые советы приветствуются.

ответ

0

После спящего режима проблема ударила меня в то, что это просто логическая логика. Итак, я придумал это решение, которое отлично работает, в котором я завернул логику рабочих запросов в теге must и поместил range boost в тег should.

{ 
    "from": 0, 
    "size": 10, 
    "query": { 
    "function_score": { 
     "boost_mode": "replace", 
     "query": { 
     "filtered": { 
      "filter": { 
      # ... 
      }, 
      "query": { 
      "bool": { 
       "must": { 
       "bool": { 
        "should": [ 
        { 
         "match": { 
         "name.suggest_ngrams": { 
          "query": "dgbdrtgndgfndrtgb", 
          "fuzziness": "AUTO", 
          "prefix_length": 1, 
          "operator": "AND", 
          "boost": 10 
         } 
         } 
        }, 
        { 
         "multi_match": { 
         "query": "dgbdrtgndgfndrtgb", 
         "fields": [ 
          "name.untouched_lowercase" 
         ], 
         "boost": 5 
         } 
        }, 
        { 
         "query_string": { 
         "fields": [ 
          "name.suggest" 
         ], 
         "query": "dgbdrtgndgfndrtgb*", 
         "boost": 10 
         } 
        }, 
        { 
         "query_string": { 
         "fields": [ 
          "name.suggest" 
         ], 
         "query": "dgbdrtgndgfndrtgb", 
         "boost": 10 
         } 
        }, 
        { 
         "match": { 
         "first_word": { 
          "query": "dgbdrtgndgfndrtgb", 
          "operator": "AND", 
          "boost": 10 
         } 
         } 
        }, 
        { 
         "match": { 
         "name": { 
          "query": "dgbdrtgndgfndrtgb", 
          "operator": "AND", 
          "boost": 5 
         } 
         } 
        } 
        ] 
       } 
       }, 
       "should": { 
       "range": { 
        "name.word_count": { 
        "lt": 2, 
        "boost": 40 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Yay!

 Смежные вопросы

  • Нет связанных вопросов^_^