2016-07-19 2 views
0

Доброе утро, В моем коде я не могу искать данные, содержащие отдельные слова. Если я ищу по одному слову все хорошо. Я думаю, проблема в картографии. Я использую почтальона. Когда я кладу в URL http://192.168.1.153:9200/sport_scouts/video/_mapping и метод использования GET я получаю:Картирование в elasticsearch

{ 
    "sport_scouts": { 
    "mappings": { 
     "video": { 
     "properties": { 
      "hashtag": { 
      "type": "string" 
      }, 
      "id": { 
      "type": "long" 
      }, 
      "sharing_link": { 
      "type": "string" 
      }, 
      "source": { 
      "type": "string" 
      }, 
      "title": { 
      "type": "string" 
      }, 
      "type": { 
      "type": "string" 
      }, 
      "user_id": { 
      "type": "long" 
      }, 
      "video_preview": { 
      "type": "string" 
      } 
     } 
     } 
    } 
    } 
} 

Все хорошее название имеют тип строки, но если искать на двух или более слов, я получаю пустой массивны. Мой код в черту:

public function search($data) { 

     $this->client(); 

     $params['body']['query']['filtered']['filter']['or'][]['term']['title'] = $data; 
     $search = $this->client->search($params)['hits']['hits']; 
     dump($search); 
    } 

Затем я называю это в своем контроллере. Можете ли вы помочь мне с этой проблемой?

+1

В чем проблема, с которой вы сталкиваетесь? – Andrej

+0

Эластик не выполняет поиск по двум или более словам, он возвращает пустой массивный, эластичный поиск только на одном слове. – first

ответ

1

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

С вашей конфигурацией отображения вы используете анализ по умолчанию, который (помимо многих других операций) выполняет токенизацию. Таким образом, каждый многословный текст, который вы вставляете, разделяется пунктуацией или пробелами. Если вы вставляете, например, «какое-то большое предложение», elasticsearch сопоставляет следующие термины вашему документу: «некоторое», «большое», «предложение», но не термин «отличное предложение». Поэтому, если вы используете фильтр терминов «отличное предложение» или любую другую часть исходного значения, содержащего пробел, вы не получите никаких результатов.

Пожалуйста, смотрите elasticsearch документы о том, как настроить отображение для индексации без анализа (https://www.elastic.co/guide/en/elasticsearch/guide/current/mapping-intro.html#_index_2) или рассмотреть возможность сделать match query вместо term filter на существующем отображении (https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html).

Помните, что если вы переключитесь на not_analyzed, вы отключите многие из функций большого нечеткого полнотекстового запроса. Конечно, вы можете настроить сопоставление, которое анализирует и анализирует и не анализирует в разных полях. Тогда вам решать, на каком поле вы хотите запросить.

+0

Большое спасибо! Это работает – first

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