Поскольку вы не предоставили запрос сопоставления и поиска, я предполагаю, что это происходит, потому что вы используете запрос запроса , а не запрос соответствия .
Срок запросы не анализируются, поэтому все, что вы ввели в свой поисковый запрос, будет сопоставлено с токенами в индексе. И по умолчанию все текстовые поля в Elasticsearch используют стандартный анализатор , который преобразует токены в нижний регистр. следовательно, GoldPGL
не соответствует, в то время как goldpgl
соответствует вашему запросу запроса.
В то время как запрос match
, как объяснено, официальный документ является анализируемым запросом, и тот же анализатор применяется к поисковому запросу, который применяется во время индекса, следовательно, GoldPGL
, а также goldpgl
преобразуется в goldpgl
, и оба запроса соответствуют документам, и то же самое относится к Gold - PGL
, что также соответствует и проверяется мной.
Анализ API очень удобен для устранения проблем такого типа, когда поисковый запрос не совпадает с индексированными токенами, и один пример того, как GOLDPGL
будет проанализирован, показан ниже:
POST / _analyze
{
"text": "GOLDPGL",
"analyzer" : "standard"
}
{ "token": "goldpgl",}
{
"text": "GOLD - PGL",
"analyzer" : "standard"
}
{
"token": "gold",
"start_offset": 0,
"end_offset": 4,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "pgl",
"start_offset": 7,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 1
}
Я воспроизвел вашу проблему и, поскольку я не знаком с NEST, показываю ваш пример с использованием REST API.
Индекс Def
POST /
{
"mappings": {
"properties": {
"product": {
"type": "text"
}
}
}
}
Индексировать некоторые документы
POST // _ doc / 1
{
"product": "GoldPGL"
}
Индекс 2-й do c
{
"product": "Gold - PGL"
}
Теперь поисковый запрос используя термин запрос (как показано в вашем примере), не возвращает Res ult (когда используется GoldPGL
)
{
"query": {
"term": {
"product": {
"value": "GoldPGL"
}
}
}
}
Когда используется goldgpl
, это дает результат
{
"query": {
"term": {
"product": {
"value": "goldpgl"
}
}
}
}
Результат
"hits": [
{
"_index": "so-term-nest",
"_type": "_doc",
"_id": "1",
"_score": 0.8025915,
"_source": {
"product": "GoldPGL"
}
}
]
Решение (использовать совпадение запрос)
{
"query": {
"match" : {
"product" : {
"query" : "GoldPGL"
}
}
}
}
и это возвращает результаты
"hits": [
{
"_index": "so-term-nest",
"_type": "_doc",
"_id": "1",
"_score": 0.8025915,
"_source": {
"product": "GoldPGL"
}
}
]