2015-08-03 4 views
1

Я унаследовал запрос Elasticsearch, который я пытаюсь изменить. Запрос у меня есть на данный момент:Elasticsearch - Фильтрованный запрос с взвешенными типами

{ 
    "fields": [ 

    ], 
    "from": 0, 
    "size": 51, 
    "query": { 
    "filtered": { 
     "query": { 
     "query_string": { 
      "fields": [ 
      "data.*" 
      ], 
      "default_operator": "AND", 
      "query": "*Search term*" 
     } 
     }, 
     "filter": [ 
     { 
      "terms": { 
      "type": [ 
       "typeOne", 
       "typeTwo", 
       "typeThree" 
      ] 
      } 
     } 
     ] 
    } 
    } 
} 

Теперь то, что я пытался сделать, это увеличить один из этих терминов в течение 2 других в результатах, но не смог заставить его работать. Я попытался добавить значение «boost», но это странно дало мне противоположный эффект - он отключает любой тип, которому дается импульс.

Я попытался следующие, как «фильтр» объект:

"filter": [ 
     { 
      "bool": { 
      "should": [ 
       { 
       "term": { 
        "type": "typeOne" 
       } 
       }, 
       { 
       "term": { 
        "type": "typeTwo" 
       } 
       }, 
       { 
       "term": { 
        "type": "typeThree", 
        "boost": 2 
       } 
       } 
      ] 
      } 
     } 
     ] 

Но, как я уже говорил ранее, вместо повышения «typeThree» удаляет все «typeThree» из результатов.

Может ли кто-нибудь помочь мне повысить определенный тип термина?

ответ

1

Есть несколько способов структурировать запрос для достижения выше, один подход будет использовать function_score .Это будет выглядеть на этих линиях

Пример:

"query": { 
     "function_score": { 
     "functions": [ 
      { 
       "filter": { 
        "term": { 
        "type": "typeThree" 
        } 
       }, 
       "weight": 2 
      } 
     ], 
     "score_mode": "sum", 
     "boost_mode": "sum", 
     "query": { 
      "filtered": { 
       "query": { 
        "query_string": { 
        "fields": [ 
         "data.*" 
        ], 
        "default_operator": "AND", 
        "query": "*search term*" 
        } 
       }, 
       "filter": [ 
        { 
        "terms": { 
         "type": [ 
          "typeOne", 
          "typeTwo", 
          "typeThree" 
         ] 
        } 
        } 
       ] 
      } 
     } 
     } 
    } 

Вы можете включить explain видеть как это влияет на подсчет очков

+0

Я получаю сообщение об ошибке «Никакая функция с именем [вес] не зарегистрирована». когда я попробую этот запрос. Является ли это функцией, которая должна быть включена или мне нужно немного настроить этот запрос? – shiznatix

1

В то время как ответ keety был на 98% от того, как туда, понадобилось немного дополнительного поиска, чтобы собрать все это вместе. Проблема в том, что «вес» здесь не работает, вместо этого вы должны использовать «boost_factor». Окончательный запрос выглядит так:

{ 
    "fields": [ 

    ], 
    "from": 0, 
    "size": 51, 
    "query": { 
     "function_score": { 
      "functions": [ 
       { 
        "filter": { 
         "term": { 
          "type": "typeOne" 
         } 
        }, 
        "boost_factor": 1.2 
       }, 
       { 
        "filter": { 
         "term": { 
          "type": "typeTwo" 
         } 
        }, 
        "boost_factor": 1.1 
       }, 
       { 
        "filter": { 
         "term": { 
          "type": "typeThree" 
         } 
        }, 
        "boost_factor": 1 
       } 
      ], 
      "score_mode": "sum", 
      "boost_mode": "sum", 
      "query": { 
       "filtered": { 
        "query": { 
         "query_string": { 
          "fields": [ 
           "data.*" 
          ], 
          "default_operator": "AND", 
          "query": "*search term*" 
         } 
        }, 
        "filter": [ 
         { 
          "terms": { 
           "type": [ 
            "typeOne", 
            "typeTwo", 
            "typeThree" 
           ] 
          } 
         } 
        ] 
       } 
      } 
     } 
    } 
} 
+0

приятно, но это, вероятно, потому, что версия es <1.4 [boost_factor] (https://www.elastic.co/guide/en/elasticsearch/reference/1.4/query-dsl-function-score-query.html#_boost_factor) устарела и заменена весом с тех пор – keety