NEST не возвращает значения для точного поиска - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь создать динамический c запрос, используя NEST, который соответствует

string product = "goldpgl";            
string agencyid = "1123";


    ISearchResponse <ProductModel> res = client().Search<ProductModel>(s => s
        .Index("proddata")
        .From(0)
        .Size(100)
        .Query(q =>                            
                    +q.Term(p => p.product, product) &&                           
                    +q.Term(p => p.agencyid, agencyid)));

Если я передам, product value = "GoldPGL" [NB ~ Реальное значение в индексе], я не могу чтобы найти результат.

Однако, если я передаю значение в нижнем регистре, как "goldpgl", оно работает.

Кроме того, оно не работает для значений, таких как "Gold - PGL" или " НЕКОТОРЫЙ ДРУГОЙ ЗАЙМ ".

Мой POCO такой же, как и

public class ProductModel
    {
        public string product { get; set; }
        public string agencyid { get; set; }

    }

Что не так и как это исправить?

1 Ответ

1 голос
/ 10 марта 2020

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

Срок запросы не анализируются, поэтому все, что вы ввели в свой поисковый запрос, будет сопоставлено с токенами в индексе. И по умолчанию все текстовые поля в 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"
                }
            }
        ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...