ElasticSearch 嵌套或查询
ElasticSearch NEST OR query
我在创建搜索不同字段的查询时遇到了一些麻烦。
我通过创建多个查询得到了我想要的答案 - 但为了性能起见 - 我想尽可能在一个查询中执行此操作。
我试过在几个 .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 等等。
有没有一种有效的方法可以在一次查询中完成此操作?
您是否尝试过使用 MultiMatch 查询? https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html
这将允许您像使用匹配查询一样搜索文档,但您应该能够指定多个字段进行搜索。
这将允许您放弃 bool 查询。
我认为包含多个部分的 should
查询的语法应该是一个查询数组。您只需添加多个单独的 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
我在创建搜索不同字段的查询时遇到了一些麻烦。 我通过创建多个查询得到了我想要的答案 - 但为了性能起见 - 我想尽可能在一个查询中执行此操作。
我试过在几个 .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 等等。 有没有一种有效的方法可以在一次查询中完成此操作?
您是否尝试过使用 MultiMatch 查询? https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html
这将允许您像使用匹配查询一样搜索文档,但您应该能够指定多个字段进行搜索。 这将允许您放弃 bool 查询。
我认为包含多个部分的 should
查询的语法应该是一个查询数组。您只需添加多个单独的 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