2015-03-30 3 views
1

Я пытаюсь настроить индекс elasticsearch, чтобы иметь политику анализа индексации по умолчанию с помощью анализатора keyword, а затем переопределять его на некоторых полях, чтобы позволить им быть свободным анализируемым текстом. Так эффективно выбирайте бесплатный текстовый анализ, где я явно указываю в сопоставлении, какие поля анализируются для бесплатного текстового сопоставления. Мое отображение Defintion выглядит следующим образом:Переопределение анализа ключевых слов по умолчанию для elasticsearch

PUT test_index 
{ 
    "mappings":{ 
     "test_type":{ 
     "index_analyzer":"keyword", 
     "search_analyzer":"standard", 
     "properties":{ 
      "standard":{ 
       "type":"string", 
       "index_analyzer":"standard" 
      }, 
      "keyword":{ 
       "type":"string" 
      } 
     } 
     } 
    } 
} 

Так standard должно быть проанализировано поле, и keyword должны быть только точное совпадение. Однако, когда я вставляю некоторые выборочные данные с помощью следующей команды:

POST test_index/test_type 
{ 
    "standard":"a dog in a rug", 
    "keyword":"sheepdog" 
} 

Я не получаю никаких совпадений с помощью следующего запроса:

GET test_index/test_type/_search?q=dog 

Однако я сделать получить матчи против:

GET test_index/test_type/_search?q=*dog* 

Что заставляет меня думать, что поле standard не анализируется. Кто-нибудь знает, что я делаю неправильно?

ответ

2

Ничего плохого в созданном индексе. Измените свой запрос на GET test_index/test_type/_search?q=standard:dog и он должен вернуть ожидаемые результаты.

Если вы не хотите указывать имя поля в запросе, обновите свое сопоставление таким образом, чтобы вы явно указали значения index_analyzer и search_analyzer для каждого поля без значений по умолчанию. Смотрите ниже:

PUT test_index 
{ 
    "mappings": { 
     "test_type": { 
     "properties": { 
      "standard": { 
       "type": "string", 
       "index_analyzer": "standard", 
       "search_analyzer": "standard" 
      }, 
      "keyword": { 
       "type": "string", 
       "index_analyzer": "keyword", 
       "search_analyzer": "standard" 
      } 
     } 
     } 
    } 
} 

Теперь, если вы попытаетесь GET test_index/test_type/_search?q=dog, вы получите желаемый результат.

+0

Я пытаюсь вернуть поведение, где мне не нужно указывать поля поиска. Поля могут быть добавлены в любое время, и не удастся добавить новые имена полей для каждого запроса, когда это произойдет. – Ceilingfish

+0

@Ceilingfish См. Мой обновленный ответ. – bittusarkar

+0

Блестящий! Благодаря! – Ceilingfish

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