2017-01-12 4 views
0

Я пытаюсь создать поле в нижнем регистре и не анализироваться в Elasticsearch 5+, чтобы искать строки с пробелами в нижнем регистре (их индексировать в смешанном случае)
Перед Elasticsearch v5 мы могли бы использовать такой анализатор, как этот, для этого:Elasticsearch не проанализирован и в нижнем регистре

"settings":{ 
    "index":{ 
     "analysis":{ 
      "analyzer":{ 
       "analyzer_keyword":{ 
       "tokenizer":"keyword", 
       "filter":"lowercase" 
       } 
      } 
     } 
    } 
    } 

Это, однако, не работает для меня прямо сейчас. И я считаю, что проблема заключается в том, что «строка» устарела и автоматически преобразуется в любое ключевое слово или текст.
Кто-нибудь здесь знает, как это сделать? Я думал о добавлении «полей» тег для моего отображения вдоль линий:

"fields": { 
    "lowercase": { 
     "type": "string" 
     **somehow convert to lowercase** 
    } 
    } 

Это сделает работу с ней немного более сложным, и я понятия не имею, как превратить его в нижний регистр либо.

Ниже вы найдете тестовую установку, которая воспроизводит мою точную проблему.

создать индекс:

{ 
    "settings":{ 
    "index":{ 
     "analysis":{ 
      "analyzer":{ 
       "analyzer_keyword":{ 
       "tokenizer":"keyword", 
       "filter":"lowercase" 
       } 
      } 
     } 
    } 
    }, 
    "mappings":{ 
    "test":{ 
     "properties":{ 
      "name":{ 
       "analyzer":"analyzer_keyword", 
       "type":"string" 
      } 
     } 
    } 
    } 
} 

Добавить тестовую запись:

{ 
    "name": "city test" 
    } 

запрос, который должен соответствовать:

{ 
    "size": 20, 
    "from": 0, 
    "query": { 
     "bool": { 
      "must": [{ 
       "bool": { 
        "should": [{ 
         "wildcard": { 
          "name": "*city t*" 
         } 
        }] 
       } 
      }] 
     } 
    } 
} 
+0

Почему вы ищете поле 'name', а поле в вашем картографировании называется' title'? Также почему бы просто не объявить его тип как «type»: «text» вместо этого? И, наконец, как «Амстердам» должен соответствовать «городскому тесту»? – Val

+0

Позвольте мне обновить примеры, я скопировал неправильные вещи :) Мои извинения. Если я объявляю это как текст, он не работает с пробелами. –

+0

То, что я в основном хочу, это иметь строку типа «Городской тест» и сопоставлять ее с «городским тестом». вот и все. –

ответ

1

При создании индекса, вам необходимо убедитесь, что analysis раздел находится прямо под разделом settings, а не внутри раздела settings > index, иначе он не будет работать.

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

{ 
    "settings":{ 
     "analysis":{ 
      "analyzer":{ 
       "analyzer_keyword":{ 
       "tokenizer":"keyword", 
       "filter":"lowercase" 
       } 
      } 
     } 
    }, 
    "mappings":{ 
    "test":{ 
     "properties":{ 
      "name":{ 
       "analyzer": "analyzer_keyword", 
       "type": "text" 
      } 
     } 
    } 
    } 
} 
+0

Это не работает в ES 1.7.1, я имею в виду, что он не поддерживает 'type'' text' – sunkuet02

+1

@ sunkuet02 в 1.7.1, вы можете использовать '" type ":" string "вместо этого, это эквивалентно – Val

+0

Я сделал это, но мне не удалось выполнить мое требование: https://stackoverflow.com/q/44648327/2315473 – sunkuet02

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