【问题标题】:Query with multimatch and wildcard使用多重匹配和通配符进行查询
【发布时间】:2019-07-11 08:32:24
【问题描述】:

我正在尝试对多个字段执行查询,但也在 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)));

【问题讨论】:

    标签: c# elasticsearch wildcard nest


    【解决方案1】:

    如果您想执行通配符查询,您需要使用类似wildcard query 的内容,并将其与bool queryCustomerName 字段上的匹配查询结合使用。

    这是显示使用情况的简单应用:

    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 tokenizerphone number analyzer plugin

    希望对您有所帮助。

    【讨论】:

    • 非常感谢,我一定会调查电话号码分析器插件。我面临的另一个问题是重复记录,例如,我有两个相同客户的记录,但 customerLastUpdated 日期不同,有没有办法只返回最近的一个?
    • 也许可以通过简单的复制创建一个单独的问题,以便人们可以看看尝试提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    相关资源
    最近更新 更多