【问题标题】:ElasticSearch NEST OR queryElasticSearch NEST OR 查询
【发布时间】:2020-02-25 23:40:03
【问题描述】:

我在创建搜索不同字段的查询时遇到了一些麻烦。 我通过创建多个查询得到了我想要的答案 - 但为了性能起见 - 如果可能的话,我想只在一个查询中执行此操作。

我尝试在几个 .Should 子句中设置查询,但它似乎搜索与每个字段匹配的文档,我认为这是有意的。 看起来像这样;

 .From(0)
             .Sort(sort => sort
             .Field("priority", SortOrder.Descending))
             .Sort(sort => sort
             .Ascending(a => a.ItemNumber.Suffix("keyword")))
             .Sort(sort => sort
             .Descending(SortSpecialField.Score))
             .TrackScores(true)
             .Size(25)
             .Query(qe => qe
             .Bool(b => b
                .Should(m => m
                   .Match(ma => ma
                      .Boost(1.1)
                      .Field("itemnumber")
                      .Query(ItemNumber)
                     ))
                 .Should(m => m
                    .Match(ma => ma
                        .Boost(1.1)
                        .Field("itemnumber2")
                        .Query(ItemNumber)))
                 .Should(m => m
                    .Match(ma => ma
                        .Boost(1.1)
                        .Field("ean")
                        .Query(ItemNumber)))
                 .Should(m => m
                    .Match(ma => ma
                        .Boost(1.1)
                        .Field("itemalias")
                        .Query(ItemNumber)))
                        )));

我想要它做的是;搜索 Itemnumber 并查看文档是否匹配,如果不匹配,则搜索 Itemnumber2 等等。 有没有一种有效的方法可以在一个查询中做到这一点?

【问题讨论】:

    标签: c# elasticsearch nest


    【解决方案1】:

    我相信包含多个部分的should 查询的语法应该是一个查询数组。您只需添加多个单独的应该查询的方式。你想要的应该是这样的:

    .Bool(b => b
        .Should(
            m => m
            .Match(ma => ma
                .Boost(1.1)
                .Field("itemnumber")
                .Query(ItemNumber)),
            m => m
            .Match(ma => ma
                .Boost(1.1)
                .Field("itemnumber2")
                .Query(ItemNumber)),
                m => m
            .Match(ma => ma
                .Boost(1.1)
                .Field("ean")
                .Query(ItemNumber)),
                m => m
            .Match(ma => ma
                .Boost(1.1)
                .Field("itemalias")
                .Query(ItemNumber)))
    

    更多here

    【讨论】:

      【解决方案2】:

      您是否尝试过使用 MultiMatch 查询? https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html

      这将允许您像使用匹配查询一样搜索文档,但您应该能够指定多个要搜索的字段。 这将允许您放弃 bool 查询。

      【讨论】:

      猜你喜欢
      • 2018-06-03
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多