2014-10-08 2 views
2

Я пытаюсь улучшить полнотекстовый поиск в нашем приложении, основанном на elasticsearch. У меня есть документы с неизвестным списком дополнительных свойств, которые должны быть доступны для поиска после индексации документа, но также есть список известных свойств, которые являются техническими метаданными, поэтому я хочу исключить эти свойства из полнотекстового поиска.Elasticsearch: Исключить некоторые известные поля из полнотекстового поиска

В настоящее время эта функция реализована с использованием запроса fuzzy_like_this, и этот запрос имеет свойство fields, но вы должны указать полный путь ко всем полям, к которым вы хотите выполнить поиск. В моем случае это не вариант, потому что я не знаю заранее список полей, и я хотел бы указать список исключений.

Я рассмотрел использовать решение, предложенное в this post установить индекс к не для этих полей метаданных, но это тоже не вариант, потому что мне нужно фильтровать некоторые из этих полей, таким образом, мне нужно индексировать их.

Я создал issue on github, который идеально подходит для того, что я хочу иметь, но он по-прежнему открыт.

Может ли кто-нибудь помочь с любым возможным решением или обходным решением здесь?

ответ

2

По умолчанию все будет проанализировано для полнотекстового поиска. Вам нужно указать mapping, чтобы предотвратить анализ полей. Способ, которым вы можете это сделать, - отправить запрос PUT вашему индексу. Отображение образца может выглядеть следующим образом:

{ 

    "mappings": { 
     "test": { 
      "properties": { 
       "country": { 
        "type": "string", 
        "index": "not_analyzed" 
       }, 
       "description": { 
        "type": "string" 
       }, 
       "modified_date": { 
        "type": "date", 
        "format": "dateOptionalTime" 
       }, 
       "posted_date": { 
        "type": "date", 
        "format": "dateOptionalTime" 
       }, 
       "title": { 
        "type": "string" 
       } 
      } 
     } 
    } 
} 

Вам нужно будет отправить его в индекс. Например

curl -XPUT http://elasticsearch:9200/myindex/ -d '{MAPPING}'

Пожалуйста, смотрите this link для получения дополнительной информации. Обратите внимание, что вы не можете изменить поле один раз. Поэтому сначала вам нужно удалить свой документ, а затем отправить сопоставление.

+0

Если вы задаете отображение как 'non_analyzed' для определенного поля, оно не будет анализироваться, но фактическое значение этого поля будет проиндексировано и будет доступно для поиска с использованием полнотекстового поиска. – klappvisor

+0

См. Ссылку, которую я дал в конце: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/mapping-intro.html#custom-field-mappings. Вы можете установить индекс: no, чтобы сделать его не подлежащим поиску. –

+0

index: no не делает его также фильтруемым, но мне нужно отфильтровать это поле. – klappvisor

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