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

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

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

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