2014-02-20 4 views
2

Я смотрю на Elasticsearch в первый раз и провел около дня, глядя на него. Мы уже широко используем Lucene и хотим начать использовать ES вместо этого. Я смотрю на альтернативные структуры данных на то, что у нас есть.Elasticsearch arrays query/filter

Если я запустил * match_all * запрос, это то, что я получаю в данный момент. Я доволен этой структурой.

{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 22, 
     "max_score": 1, 
     "hits": [ 
     { 
      "_index": "integration-test-static", 
      "_type": "sport", 
      "_id": "4d38e07b-f3d3-4af2-9221-60450b18264a", 
      "_score": 1, 
      "_source": { 
       "Descriptions": [ 
        { 
        "FeedSource": "dde58b3b-145b-4864-9f7c-43c64c2fe815", 
        "Value": "Football" 
        }, 
        { 
        "FeedSource": "e4b9ad44-00d7-4216-adf5-3a37eafc4c93", 
        "Value": "Football" 
        } 
       ], 
       "Synonyms": [ 
        "Football" 
       ] 
      } 
     } 
     ] 
    } 
} 

То, что я не могу понять, как запрос записывается тянуть обратно этот документ путем поиска синонима «Футбольный». Похоже, это должно быть легко!

У меня был такой подход после прочтения этого вопроса: http://gibrown.wordpress.com/2013/01/24/elasticsearch-five-things-i-was-doing-wrong/ Он упоминает сохранение нескольких полей в массивах. Я понимаю, что мой пример не имеет нескольких полей, но мы обязательно будем искать решение, которое может удовлетворить их.

Пробовал различные различные запросы с фильтрами, bool things, term this и terms that, no return.

ответ

5

Что поиск и отображение выглядит?

Если вы позволите Elasticsearch сгенерировать отображение, он будет использовать стандартный анализатор, который уменьшает текст (и удаляет стоп-слова).

Таким образом, Football будет фактически проиндексирован как football. term -семейство запросов/фильтров не анализирует текст, поэтому term:Football будет искать Football, который не индексируется. match -семейство запросов.

Это очень распространенная проблема, и я довольно подробно освещен в своей статье на странице Troubleshooting Elasticsearch searches, for Beginners, которую можно сэкономить. Текстовый анализ - очень важная часть работы с поиском, поэтому есть и some more articles about.

+0

Спасибо за быстрый ответ (и Акшай). Я обязательно просмотрю руководство для новичков. Через несколько дней все начнет погружаться ... –

2

Простой запрос соответствия будет работать в этом сценарии.

POST integration-test-static/_search 
{ 
    "query": { 
     "match": { 
      "Synonyms": "Football" 
     } 
    } 
} 

Который возвращает:

{ 
    "took": 0, 
    "timed_out": false, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 1, 
     "max_score": 0.30685282, 
     "hits": [ 
     { 
      "_index": "integration-test-static", 
      "_type": "sport", 
      "_id": "4d38e07b-f3d3-4af2-9221-60450b18264a", 
      "_score": 0.30685282, 
      "_source": { 
       "Descriptions": [ 
        { 
        "FeedSource": "dde58b3b-145b-4864-9f7c-43c64c2fe815", 
        "Value": "Football" 
        }, 
        { 
        "FeedSource": "e4b9ad44-00d7-4216-adf5-3a37eafc4c93", 
        "Value": "Football" 
        } 
       ], 
       "Synonyms": [ 
        "Football" 
       ] 
      } 
     } 
     ] 
    } 
} 
+0

Спасибо, я также подтверждаю, что это работает. Не могли бы вы показать, как я могу найти «Футбол». Чтобы избежать возвращения «американского футбола», например? –

+0

Как говорит Алекс, вы можете много сделать с анализаторами, чтобы помочь вам в индексировании и запросах. Простым взглядом является анализатор ключевых слов. Это преобразует все в нижний регистр, но обрабатывает всю строку как одно слово, а не разбивает его. Итак, поиск термина: футбол не будет соответствовать термину: «Американский футбол» – Akshay

+0

Анализатор ключевых слов был именно тем, что я искал здесь. –