Проблема с дефисом эластичного поиска с фильтром терминов
У меня есть следующий эластичный поисковый запрос только с фильтром терминов. Мой запрос намного сложнее, но я просто пытаюсь показать здесь вопрос.
{
"filter": {
"term": {
"field": "update-time"
}
}
}
когда я передаю дефисное значение в фильтр,я получаю нулевые результаты. Но если я попытаюсь без unhyphenated значения, я получаю результаты обратно. Я не уверен, что дефис является проблемой здесь, но мой сценарий заставляет меня верить в это.
есть ли способ избежать дефиса, чтобы фильтр возвращал результаты? У меня есть попытался избежать дефиса с обратной косой чертой, которую я читал с форумов Lucene, но это не помогло.
кроме того, если я передам значение GUID в это поле, которое является дефисом и окружено фигурными скобками, что - то вроде-{ASD23-34SD-DFE1-42FWW}, мне нужно будет понизить регистр символов алфавита и мне тоже нужно будет избежать фигурных скобок?
спасибо
3 ответов
Я бы предположил, что ваше поле анализируется, что является настройкой по умолчанию для строковых полей в elasticsearch. В результате, когда он индексируется, он индексируется не как один термин "время обновления", а как 2 термина:" обновление "и"время". Поэтому ваш поиск не могу найти этот термин. Если ваше поле всегда будет содержать значения, которые должны быть полностью сопоставлены как есть, лучше всего определить такое поле в сопоставлении как не анализируемое. Вы можете сделать это, воссоздав индекс с помощью new отображение:
curl -XPUT http://localhost:9200/your-index -d '{
"mappings" : {
"your-type" : {
"properties" : {
"field" : { "type": "string", "index" : "not_analyzed" }
}
}
}
}'
curl -XPUT http://localhost:9200/your-index/your-type/1 -d '{
"field" : "update-time"
}'
curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{
"filter": {
"term": {
"field": "update-time"
}
}
}'
кроме того, если вы хотите получить некоторую гибкость в поиске записей на основе этого поля, вы можете сохранить это поле проанализированным и использовать текстовые запросы:
curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{
"query": {
"text": {
"field": "update-time"
}
}
}'
пожалуйста, имейте в виду, что если ваше поле анализируется, то эта запись будет найдена путем поиска только слова "update" или слова "time".
принятый ответ не работал для меня с elastic 6.1. Я решил его, используя поле "ключевое слово", которое elastic предоставляет по умолчанию для строковых полей.
{
"filter": {
"term": {
"field.keyword": "update-time"
}
}
}
на основе ответа по @imotov если вы используете spring-data-elasticsearch затем все, что вам нужно сделать, это пометить поля как:
@Field(type = FieldType.String, index = FieldIndex.not_analyzed)
вместо
@Field(type = FieldType.String)
проблема в том, что вам нужно удалить индекс и повторно создать его с новыми сопоставлениями.