Проблема с дефисом при поиске с фильтром терминов

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

{
    "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)

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

Другие вопросы по тегам