2016-05-13 4 views
1

Итак, я пытаюсь достичь частичного соответствия с настраиваемыми полями поиска для каждого индекса. Я генерирую match_phrase_prefix со значением для поиска, и если это более одного слова, я генерирую еще одно слово (я мог бы использовать prefix, но он прослушивал или имел недокументированные настройки).Как увеличить запрос индексов в булевом запросе

В этом случае я пытаюсь найти "belden cable"; запрос выглядит следующим образом:

{ 
    "query":{ 
     "bool":{ 
      "should": 
      [ 
       { 
        "indices":{ 
         "indices":["addresss"], 
         "query":{ 
          "bool":{ 
           "should": 
           [ 
            {"match_phrase_prefix":{"name":"BELDEN CABLE"}} 
            {"match_phrase_prefix":{"name":"BELDEN"}}, 
            {"match_phrase_prefix":{"name":"CABLE"}} 
           ] 
          } 
         }, 
         "no_match_query":"none" 
        } 
       }, 
       { 
        "indices":{ 
         "indices":["customers"], 
         "query":{ 
          "bool":{ 
           "should":[ 
            {"match_phrase_prefix":{"_all":"BELDEN CABLE"}}, 
            {"match_phrase_prefix":{"_all":"CABLE"}}, 
            {"match_phrase_prefix":{"_all":"BELDEN"}} 
           ] 
          } 
         }, 
        "no_match_query":"none" 
       } 
      } 
     ] 
    } 
} 

Моя цель поиска, чтобы получить результаты, которые имеют "belden cable" сначала, тогда поиски только "belden" или "cable".

Это возвращает (на пример) 4 результата, у которых есть "belden cable", а затем результат, который имеет только "cable", то другие результаты поиска "belden cable".

Как я могу повысить результаты, которые имеют полное значение поиска? («Belden кабель»)

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

Также я попытался использовать повышающий заявление внутри match_phrase_prefix для "belden cable" без изменения результатов ..

+0

Что такое отображение поля 'name'? –

+0

"name": {"type": "string"} –

ответ

1

Что вы на самом деле нужно, это другой способ анализа входных данных. Ниже приведено что-то, что должно стать отправной точкой для вашего окончательного решения (потому что вам нужно учитывать полный набор требований к вашим запросам и анализу данных). Поиск с помощью ES - это не только о запросах, но и о том, как вы структуру и подготовить данные.

Идея состоит в том, что вы хотите, чтобы ваши данные анализировались так, чтобы belden cable оставался как есть. При отображении "name": {"type": "string"} используется анализатор standard, что означает, что список терминов в вашем индексе - belden и cable. Вам действительно нужно [belden cable, belden, cable]. Итак, я подумал о том, чтобы предложить маркерный фильтр shingles.

DELETE /addresss 
PUT /addresss 
{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "analyzer_shingle": { 
      "tokenizer": "standard", 
      "filter": [ 
      "standard", 
      "lowercase", 
      "shingle" 
      ] 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "test": { 
     "properties": { 
     "name": { 
      "type": "string", 
      "analyzer": "analyzer_shingle" 
     } 
     } 
    } 
    } 
} 
DELETE /customers 
PUT /customers 
{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "analyzer_shingle": { 
      "tokenizer": "standard", 
      "filter": [ 
      "standard", 
      "lowercase", 
      "shingle" 
      ] 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "test": { 
     "_all": { 
     "analyzer": "analyzer_shingle" 
     } 
    } 
    } 
} 

POST /addresss/test/_bulk 
{"index":{}} 
{"name": "belden cable"} 
{"index":{}} 
{"name": "belden cable yyy"} 
{"index":{}} 
{"name": "belden cable xxx"} 
{"index":{}} 
{"name": "belden bla"} 
{"index":{}} 
{"name": "cable bla"} 

POST /customers/test/_bulk 
{"index":{}} 
{"field1": "belden", "field2": "cable"} 
{"index":{}} 
{"field1": "belden cable yyy"} 
{"index":{}} 
{"field2": "belden cable xxx"} 
{"index":{}} 
{"field2": "belden bla"} 
{"index":{}} 
{"field2": "cable bla"} 

GET /addresss,customers/test/_search 
{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "indices": { 
      "indices": [ 
       "addresss" 
      ], 
      "query": { 
       "bool": { 
       "should": [ 
        { 
        "match_phrase_prefix": { 
         "name": "BELDEN CABLE" 
        } 
        }, 
        { 
        "match_phrase_prefix": { 
         "name": "BELDEN" 
        } 
        }, 
        { 
        "match_phrase_prefix": { 
         "name": "CABLE" 
        } 
        } 
       ] 
       } 
      }, 
      "no_match_query": "none" 
      } 
     }, 
     { 
      "indices": { 
      "indices": [ 
       "customers" 
      ], 
      "query": { 
       "bool": { 
       "should": [ 
        { 
        "match_phrase_prefix": { 
         "_all": "BELDEN CABLE" 
        } 
        }, 
        { 
        "match_phrase_prefix": { 
         "_all": "CABLE" 
        } 
        }, 
        { 
        "match_phrase_prefix": { 
         "_all": "BELDEN" 
        } 
        } 
       ] 
       } 
      }, 
      "no_match_query": "none" 
      } 
     } 
     ] 
    } 
    } 
} 
+0

Действительно, он работает с этим сопоставлением. Помощь очень ценится. –

+0

Используя этот подход, можно ли увеличить баллы для документов, которые соответствуют большей черепице (и, следовательно, больше похожи на запрос?) – derelict

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