2015-09-23 3 views
0

Я хотел бы создать индекс в ElasticSearch, который хранит определенный тип данных, который имеет некоторые строковые поля. Язык венгерский.ElasticSearch с анализатором hunspell

Я побежал команду HTTP PUT со следующим телом:

{ 
    "settings" : { 
     "analysis" : { 
      "analyzer" : { 
       "hu" : { 
        "tokenizer" : "standard", 
        "filter" : [ "lowercase", "hu_HU" ]   
       } 
      }, 
      "filter" : { 
       "hu_HU" : { 
        "type" : "hunspell", 
        "locale" : "hu_HU", 
        "language" : "hu_HU" 
       } 
      }  
     } 
    }, 
    "mappings": { 
     "printedArticle": { 
      "_source": {"enabled": false}, 
      "properties": { 
       "_id": {"type": "string", "store": true}, 
       "mysqlid": {"type": "long", "store": false}, 
       "publishDate": {"type": "date", "format": "dateOptionalTime", "store": false}, 
       "title": {"type": "string", "analyzer": "hu", "analyze": true, "store": false}, 
       "lead": {"type": "string", "analyzer": "hu", "analyze": true, "store": false}, 
       "content": {"type": "string", "analyzer": "hu", "analyze": true, "store": false}, 
       "participants": {"type": "string", "analyzer": "hu", "analyze": true, "store": false}, 
       "authors": {"type": "string", "analyzer": "hu", "analyze": true, "store": false}, 
       "subtitle": {"type": "string", "analyzer": "hu", "analyze": true, "store": false} 
      } 
     } 
    } 
} 

Затем я вставил одну записи с тестовым текстом, и если я запустить поиск через эластичный API с запросом GET, как это:

http://localhost:9200/mf_pa/_search?q=MYTESTTEXT 

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

Я попытался проанализировать некоторый подобный текст на основе анализа API:

http://localhost:9200/mf_pa/_analyze?analyzer=hu&text=My text to tokenize 

и лексемы мой тестовый текст правильно. Исходя из этого факта, я ожидаю, что если я положу ранее найденный токен в свой поисковый запрос, он найдет запись, но это не так.

Для английского примера я бы сказал, что мой текст «незабываемый», и мой запрос «забыл». Что нужно сделать, чтобы найти запись?

ответ

0

Если анализатор проверяет использование API анализа, он также должен работать в сопоставлении. Вот некоторые вещи для проверки:

  1. Убедитесь, что отображение было успешно введено. GET /mf_pa/_mapping

    Например, "analyze": true должен быть "index": "analyzed"

  2. Убедитесь, что тестовый документ был на самом деле правильно индексироваться как тип printedArticle.

    GET /mf_pa/_searchдолжен вернуть ваш тестовый документ, показывая"_type": "printedArticle".

  3. Вы можете также использовать анализ API для проверки, как текст будет анализировать против конкретного поля (для обеспечения анализатор правильного применения в этой области)

    например GET /mf_pa/_analyze/?field=title&text=A kőszivű ember fiai

+0

Спасибо за ваш ответ! Сначала я заметил, что мои тестовые данные не были вставлены правильно (я вставил в printArticles вместо printArticle). Я также проверил отображение и изменил «анализ»: true 'to' "index": "проанализировано". Я также проверил анализатор, и оказалось, что он правильно анализирует мой текст. Я выполнил поисковый запрос, в котором я указал поле: «GET/mf_pa/_search? Field = title & text = MYTESTTEXT», и это было успешно. Итак, я думаю, мой вопрос заключается в том, как искать во всех полях? – maestro

+0

Также выяснилось, что если я задаю параметр 'text' для поиска, например. '/ mf_pa/_search? text = MYTESTTEXT', он возвращает правильный результат, поэтому мой поисковый запрос был неправильным. Спасибо за ваш ответ, вы указали, что мое сопоставление было неправильным, и я использовал API поиска неправильно ... – maestro

+0

По какой-то странной причине на веб-странице ElasticSearch все поисковые запросы отображаются как 'GET', а не' POST'. Если я запускаю поиск как 'POST', он работает. – maestro