Подтвердить что ты не робот

Эластичный поиск Hyphen issue with term filter

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

{
    "filter": {
            "term": {
                    "field": "update-time"
                }
        }
}

Когда я передаю в дефисное значение фильтр, я получаю нулевые результаты. Но если я попытаюсь без неопределенного значения, я получаю результаты назад. Я не уверен, что проблема с дефисом здесь, но мой сценарий заставляет меня в это поверить.

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

Кроме того, если я передам значение GUID в это поле, которое переносится и окружено фигурными фигурными фигурными скобками, что-то вроде - {ASD23-34SD-DFE1-42FWW}, мне нужно было бы опустить буквы алфавита и мне нужно чтобы избежать фигурных скобок?

Спасибо

4b9b3361

Ответ 1

Я бы предположил, что ваше поле проанализировано, которое является установкой по умолчанию для строковых полей в elasticsearch. В результате, когда он индексировал его, он не индексировался как один термин "время обновления", а вместо этого в качестве двух терминов: "обновление" и "время". Вот почему ваш термин поиск не может найти этот термин. Если ваше поле всегда будет содержать значения, которые должны быть сопоставлены полностью как есть, было бы лучше определить такое поле при сопоставлении, которое не анализируется. Вы можете сделать это, воссоздав индекс с новым отображением:

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"
        }
    }
}'

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

Ответ 2

На основе ответа @imotov Если вы используете spring-data-elasticsearch тогда все, что вам нужно сделать, это отметить ваше поле как:

@Field(type = FieldType.String, index = FieldIndex.not_analyzed)

вместо

@Field(type = FieldType.String)

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