Проблема с дефисом при поиске с фильтром терминов
У меня есть следующий эластичный поисковый запрос только с фильтром терминов. Мой запрос гораздо сложнее, но я просто пытаюсь показать проблему здесь.
{
"filter": {
"term": {
"field": "update-time"
}
}
}
Когда я передаю дефис в значение фильтра, я получаю ноль результатов обратно. Но если я попытаюсь без значения без текста, я получу результаты обратно. Я не уверен, является ли дефис здесь проблемой, но мой сценарий заставляет меня в это верить.
Есть ли способ избежать дефиса, чтобы фильтр возвращал результаты? Я пытался избежать дефиса с помощью обратной косой черты, которую я читал на форумах Lucene, но это не помогло.
Кроме того, если я передам значение GUID в это поле, которое содержит дефисы и окружено фигурными скобками, что-то вроде - {ASD23-34SD-DFE1-42FWW}, потребуется ли вводить символы алфавита в нижнем регистре и мне нужно экранировать фигурные скобки тоже?
Спасибо
3 ответа
Я предполагаю, что ваше поле анализируется, что является настройкой по умолчанию для строковых полей в asticsearch. В результате, когда он проиндексирован, он не индексируется как один термин "время обновления", а вместо этого как 2 термина: "обновление" и "время". Вот почему ваш поисковый запрос не может найти этот термин. Если ваше поле всегда будет содержать значения, которые должны быть полностью сопоставлены как есть, было бы лучше определить такое поле в отображении как не проанализированное. Вы можете сделать это, воссоздав индекс с новым отображением:
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"
}
}
}'
Пожалуйста, имейте в виду, что если ваше поле анализируется, то эта запись будет найдена путем поиска только слова "обновление" или слово "время".
Принятый ответ не работал для меня с эластичной 6.1. Я решил это, используя поле "ключевое слово", которое по умолчанию предоставляет эластичность для строковых полей.
{
"filter": {
"term": {
"field.keyword": "update-time"
}
}
}
Основываясь на ответе @imotov. Если вы используете spring-data -asticsearch, все, что вам нужно сделать, это пометить поле как:
@Field(type = FieldType.String, index = FieldIndex.not_analyzed)
вместо
@Field(type = FieldType.String)
Проблема в том, что вам нужно удалить индекс и создать его экземпляр с новыми сопоставлениями.