2015-07-29 2 views
0

Я столкнулся с ошибкой поиска - вам нужна помощь. У меня есть индекс статьи с полями id, title, artist, genre. Когда я запускаю этот запрос я получаю нулевой конечные результатыElasticSearch - поиск не выполняется для двух строковых полей

POST/d3acampaign/статьи/_search

{ 
     "query": { 
      "filtered": { 
       "query": { 
        "match": {"genre": "metal"}  
       }, 
       "filter": { 
        "term": {"artist": "Somanath"}   
       } 

      } 
     } 
    } 

Но если я изменить запрос на что-то вроде - POST/d3acampaign/статьи/_search

{ 
     "query": { 
      "filtered": { 
       "query": { 
        "match": {"genre": "metal"}  
       }, 
       "filter": { 
        "term": {"id": "7"}   
       } 

      } 
     } 
    } 

я получаю следующий результат -

{ 
     "took": 1, 
     "timed_out": false, 
     "_shards": { 
      "total": 5, 
      "successful": 5, 
      "failed": 0 
     }, 
     "hits": { 
      "total": 1, 
      "max_score": 1.4054651, 
      "hits": [ 
      { 
       "_index": "d3acampaign", 
       "_type": "article", 
       "_id": "7", 
       "_score": 1.4054651, 
       "_source": { 
        "id": "7", 
        "title": "The Last Airbender", 
        "artist": "Somanath", 
        "genre": "metal" 
       } 
      } 
      ] 
     } 
    } 

Разъяснение - Я уведомлен cing search failing в случае, если я пытаюсь использовать строку, например. исполнитель, название

ответ

0

Причина того как вы получат пустые хиты, когда вы запрашиваете с помощью term query, он будет соответствовать точного термина в индексе включает прописных.

и анализатор по умолчанию создаст индекс в нижнем регистре.

Есть много способов анализа текста: Стандартный анализатор по умолчанию падает большинство знаков препинания, разбивает текст на отдельные слова, и нижних случаи их. https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html

Решение:

{ 
     "query": { 
      "filtered": { 
       "query": { 
        "match": {"genre": "metal"}  
       }, 
       "filter": { 
        "term": {"artist": "somanath"} //to lower case  
       } 

      } 
     } 
    } 

Другое решение изменить индекс отображения к not_analyzed для вашего типа индекса.

Полный пример:

#!/bin/bash 

curl -XDELETE "localhost:9200/testindex" 
curl -XPUT "localhost:9200/testindex/?pretty" -d ' 
{ 
    "mappings":{ 
     "test":{ 
      "properties":{ 
       "name":{ 
        "index":"not_analyzed", 
         "type":"string" 
       } 
      } 
     } 
    } 
}' 

curl -XGET "localhost:9200/testindex/_mapping?pretty" 

curl -XPOST "localhost:9200/testindex/test/1" -d '{ 
    "name": "Jack" 
}' 

sleep 1 
echo -e 
echo -e 
echo -e 
echo -e "Filtered Query Search in not_analyzed index:" 
echo -e 

curl -XGET "localhost:9200/testindex/test/_search?pretty" -d '{ 
    "query": { 
     "filtered": { 
       "filter": { 
        "term": {"name": "Jack"} 
       } 

     } 
    } 
}' 
+0

Из [официальный документ] (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html): «И HTTP GET, и HTTP POST могут использоваться для выполнения поиска с телом. Поскольку не все клиенты поддерживают GET с телом, POST также разрешен». – Val

+0

@Val Да, вы правы. Спасибо:) – chengpohi

+0

Я попытался преобразовать индекс 'not_analyzed', все еще сталкиваясь с той же проблемой. пожалуйста, подтвердите, правильно ли настроено сопоставление, – Guruprasad

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