2016-07-08 5 views
0

Мне нужно написать очень сложный запрос в Elastic Search.искаженный запрос в упругом поиске

Запроса хранится в виде строки, query, и идея заключается в том, чтобы сделать «Ий» матч на полях title и content, но затем придать особый вес для таких слов, как «Java» или «питон».

Моя попытка сделать это

{ 
    "fields": ["title","content","id"], 
    "query": { 
     "function_score": { 
     "query": 
     { 
       "bool": 
       { 
        "should": 
        [ 
         {"match": {"title": {"query": query, "boost": 15}}}, 
         {"match": {"content": {"query": query, "boost": 9}}} 
        ] 
       } 
      } 
     }, 
     "functions": [ 
      { 
      "filter": { 
       "match": { 
       "title": "java" 
      }}, 
      "weight": 2 }, 
      { 
      "filter": { 
       "match": { 
       "title": "python" 
      }}, 
      "weight": 2 } 
     ], 
     "boost_mode": "multiply" 
     } 
} 

Но я получаю сообщение об ошибке, говорящее о том, что запрос имеет неверный формат. Простите, если это наивные вопросы, но я не знаю, куда еще обратиться.

ответ

0

Попробуйте это:

{ 
    "fields": [ 
    "title", 
    "content", 
    "id" 
    ], 
    "query": { 
    "function_score": { 
     "query": { 
     "bool": { 
      "should": [ 
      { 
       "match": { 
       "title": { 
        "query": query, 
        "boost": 15 
       } 
       } 
      }, 
      { 
       "match": { 
       "content": { 
        "query": query, 
        "boost": 9 
       } 
       } 
      } 
      ] 
     } 
     }, 
     "functions": [ 
     { 
      "filter": { 
      "match": { 
       "title": "java" 
      } 
      }, 
      "weight": 2 
     }, 
     { 
      "filter": { 
      "match": { 
       "title": "python" 
      } 
      }, 
      "weight": 2 
     } 
     ], 
     "boost_mode": "multiply" 
    } 
    } 
} 
+0

спасибо! этот запрос действительно работает. – Brian

+0

Я вижу, что если я не использую никаких фильтров (т. Е. «Фильтры»: []), я получаю те же результаты, но разные оценки, а затем при использовании части под «bool» в обычном запросе. Ты знаешь почему? – Brian

+0

Ну, конечно, в этом все эти фильтры. Из документов, которые соответствуют запросу, те, которые соответствуют фильтрам, будут иметь разные оценки, в соответствии с этой конкретной функцией (в вашем случае функция 'weight'). '" boost_mode ":" multiply "и' weight: 2' означает, что документы, которые 'title' соответствуют' java' или 'python', будут иметь нормальный балл, созданный запросом, умноженным на значение' weight'. –

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