Поиск с анализатором русского текста не работает - PullRequest
0 голосов
/ 13 июля 2020

У меня очень простая модель для ElasticSearch:

[ElasticsearchType(RelationName = "example")]
public class ElasticModel
{
    [Text(Name = "description", Analyzer = "Russian", Index = true, SearchAnalyzer = "Russian")]
    public string Description { get; set; }
}

, затем я инициализирую свой индекс следующей строкой:

protected ICreateIndexRequest ConfigureIndex(CreateIndexDescriptor indexDescriptor,
            Func<IndexSettingsDescriptor, IPromise<IIndexSettings>> selectorOfIndexSettings)
        {
            ICreateIndexRequest returnValue;

            returnValue = indexDescriptor.Settings(selectorOfIndexSettings);
            return returnValue;
        }

    await _client.Indices.CreateAsync(completeIndexName, indexDescriptor => ConfigureIndex(indexDescriptor, selector));

, затем инициализирую свою модель следующим значением и пробую для поиска:

var document = new ElasticModel()
                        {
                            Description = "В Москве все выходные будут дожди"
                        };

                        var responseDoc = await await _client.IndexAsync(new IndexRequest<T>(document, completeIndexName))

var responseSearch = await _client.SearchAsync<ElasticModel>(s => s.Index(completeIndexName)
                            .Query(q => q.QueryString(c => c
                                                            .Query("выходной")
                            )));

, но результат пуст. Когда я делаю следующий запрос на свой сервер Elasticsearch:

POST {{ElasticSearchAddress}}/_analyze
{
  "analyzer": "russian",
  "text": "В Москве все выходные будут дожди"
}

, я вижу ожидаемый результат:

{
    "tokens": [
        {
            "token": "москв",
            "start_offset": 2,
            "end_offset": 8,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "выходн",
            "start_offset": 13,
            "end_offset": 21,
            "type": "<ALPHANUM>",
            "position": 3
        },
        {
            "token": "будут",
            "start_offset": 22,
            "end_offset": 27,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "дожд",
            "start_offset": 28,
            "end_offset": 33,
            "type": "<ALPHANUM>",
            "position": 5
        }
    ]
}

Кто-нибудь может мне объяснить, почему мой поиск из C# -кода не использует Русский анализатор и не возвращает мне ожидаемый результат?

UPDATE:

Запрос к / elastictest100 / _search с телом:

{
  "query": {
    "multi_match" : {
      "query":    "выходные будут", 
      "fields": [ "description" ],
      "analyzer": "russian"
    }
  }
}

return me:

{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 0.13353139,
        "hits": [
            {
                "_index": "mediadev-elastictest100",
                "_type": "_doc",
                "_id": "G2FzRnMBhdWoY2X4fmQo",
                "_score": 0.13353139,
                "_source": {
                    "description": "В Москве все выходные будут дожди"
                }
            },
            {
                "_index": "mediadev-elastictest100",
                "_type": "_doc",
                "_id": "HGGLRnMBhdWoY2X4AGSV",
                "_score": 0.13353139,
                "_source": {
                    "description": "В Москве все выходные будут дожди"
                }
            },
            {
                "_index": "mediadev-elastictest100",
                "_type": "_doc",
                "_id": "HWGMRnMBhdWoY2X4tGSY",
                "_score": 0.13353139,
                "_source": {
                    "description": "В Москве все выходные будут дожди"
                }
            }
        ]
    }
}

с телом:

{
  "query": {
    "multi_match" : {
      "query":    "выходной будет", 
      "fields": [ "description" ],
      "analyzer": "russian"
    }
  }
}

верни мне:

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 0,
            "relation": "eq"
        },
        "max_score": null,
        "hits": []
    }
}

1 Ответ

1 голос
/ 13 июля 2020

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

  1. Попытайтесь распечатать JSON вашего окончательного поискового запроса, чтобы вы могли легко его протестировать использование конечной точки поиска REST для сравнения, генерируете ли вы правильный запрос или нет.
  2. В запросах на сопоставление используется тот же анализатор, который используется во время индексации, но запросы терминов не анализируются, что вызывает такого рода проблемы, и конец результата поиска должен соответствовать маркерам времени индекса для маркеров времени поиска.

Легче всего проверить поиск JSON и попасть прямо в ваш индекс с помощью ES REST конечная точка, чтобы увидеть причину root.

...