【问题标题】:Match and Match_phrase on multiple fields with the same query string- Elastic Search(Nest)在具有相同查询字符串的多个字段上进行匹配和 Match_phrase - Elastic Search(Nest)
【发布时间】:2016-05-23 01:24:14
【问题描述】:

我必须在多个字段中搜索同一查询字符串的关键字。

"bool": {
        "should": [
            {
                "match": {
                            "ABC": "Apple"
                         }
            },
            {
                "match": {
                            "XYZ": "Apple"
                         }
            }
        ]
    }

我写查询DSL的时候,已经翻译成multimatch query(不知道上面的代码和DSL是否一样)

.Bool(b => b
.Should(sh => sh
.MultiMatch(c => c
.Fields(f => f.Field(p => p.ABC).Field("XYZ"))
.Query(keyz)))))

同样,我想编写一个 DSL 查询,但我想做 match_phrase 操作。谁能帮我解决这个问题。

TIA

【问题讨论】:

    标签: c# elasticsearch nest querydsl


    【解决方案1】:

    给定一个文档类型

    public class Document
    {
        public string ABC { get; set; }
        public string XYZ { get; set; }
    }
    

    这将是

    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
    var defaultIndex = "default-index";
    var connectionSettings = new ConnectionSettings(pool)
            .DefaultIndex(defaultIndex)
            .DefaultFieldNameInferrer(p => p);
    
    var client = new ElasticClient(connectionSettings); 
    var keyz = "Apple";
    
    client.Search<Document>(s => s
        .Query(q => q
            .Bool(b => b
                .Should(sh => sh
                    .Match(c => c
                        .Field(p => p.ABC)
                        .Query(keyz)
                    ),
                        sh => sh
                    .Match(c => c
                        .Field(p => p.XYZ)
                        .Query(keyz)
                    )
                )
            )
        )
    );
    

    您可以将其缩短为 taking advantage of operator overloading

    client.Search<Document>(s => s
        .Query(q => q
            .Match(c => c
                .Field(p => p.ABC)
                .Query(keyz)
            )
            || q.Match(c => c
                .Field(p => p.XYZ)
                .Query(keyz)
            )
        )
    );
    

    两者都生产

    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "ABC": {
                  "query": "Apple"
                }
              }
            },
            {
              "match": {
                "XYZ": {
                  "query": "Apple"
                }
              }
            }
          ]
        }
      }
    }
    

    【讨论】:

    • 嗨,拉斯。谢谢您的帮助。我可以知道为什么要使用“.DefaultFieldNameInferrer(p => p)”吗?它有什么帮助?我实际上是在尝试先运行 match_phrase,如果 match_phrase 查询中的命中为 0,那么我计划运行 Match 查询。
    • 查看.DefaultFieldNameInferrer() - elastic.co/guide/en/elasticsearch/client/net-api/current/… 的文档。它允许您控制如何从 POCO 属性名称推断字段名称。您可以使用 bool 查询同时运行 match_phrasematch
    • 谢谢拉斯。但我想先在两个字段上运行 match_phrase,如果结果为 0,那么想再次在这些字段上运行匹配查询。我不打算在一个字段上进行 match_phrase 并在另一个字段上进行匹配。我的多重匹配 DSL 查询错了吗?
    • 我明白 - 我建议您可能不需要使用两个单独的请求来实现您想要的。 multi_match 的语法是正确的。
    • 哦,好吧。我现在知道了。所以这意味着我可以在同一个 bool 中同时编写 match_phrase 和 match 查询,对这两个查询使用“should”?是否可以使用两个查询(例如搜索 query:Appletype: ".pdf")编写 match_phrase 并与同一查询中的一个查询匹配?还有一件事拉斯。当我使用您的代码时,即使在连接设置中添加 defaultFieldNameInferrer 后,我也得到 0 结果,因为 multimatch 正在检索值。我错过了什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    相关资源
    最近更新 更多