Запрос с несколькими совпадениями и подстановочными знаками - PullRequest
1 голос
/ 11 июля 2019

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

var response = await this.client.SearchAsync<ElasticCustomer>(searchDescriptor => searchDescriptor
          .AllTypes()
            .Query(q => q
                     .MultiMatch(m => m
                            .Fields(f => f
                                .Field(u => u.CustomerName)
                                .Field(u => u.MobileNumber))
                          .Query(query)))
          .Size(pageSize)
          .Sort(q => q.Descending(u => u.CustomerLastUpdated)));

1 Ответ

1 голос
/ 11 июля 2019

Если вы хотите выполнить подстановочный запрос, вам нужно будет использовать что-то вроде подстановочный запрос и объединить его с запросом на совпадение в поле CustomerName в bool запрос .

Вот простое приложение, показывающее использование:

class Program
{
    public class Document  
    {
        public int Id { get; set; }
        public DateTime Timestamp { get; set; }
        public string CustomerName { get; set; }
        public string MobileNumber { get; set; }
    } 

    static async Task Main(string[] args)
    {
        var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
        var connectionSettings = new ConnectionSettings(pool);
        connectionSettings.DefaultIndex("documents");

        var client = new ElasticClient(connectionSettings);

        await client.Indices.DeleteAsync("documents");
        await client.Indices.CreateAsync("documents");

        var response = await client.IndexAsync(
            new Document
            {
                Id = 1, 
                Timestamp = new DateTime(2010, 01, 01, 10, 0, 0),
                MobileNumber = "3530831112233",
                CustomerName = "Robert"
            }, descriptor => descriptor);

        await client.Indices.RefreshAsync();

        string query = "8311122";
        var result = await client.SearchAsync<Document>(s => s
            .Query(q => q.Bool(b => b
                .Should(
                    sh => sh.Match(m => m.Field(f => f.CustomerName).Query(query)),
                    sh => sh.Wildcard(w => w.Field(f => f.MobileNumber.Suffix("keyword")).Value($"*{query}*"))))));

        foreach (var document in result.Documents)
        {
            Console.WriteLine(document.Id);
        }
    }
}

Выход:

1

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

В качестве подстановочного знака вы можете взглянуть на ngram tokenizer или плагин анализатора телефонных номеров .

Надеюсь, это поможет.

...