如何在 ElasticSearch 中搜索多个条件
How to search multiple conditions in ElasticSearch
我正在使用 Nest
连接到 ElasticSearch 并执行一些查询。到目前为止,我已经能够通过如下所示的单个通配符查询获得我要求的结果:
var searchResults = _client.Search<MyIndexable>(
body =>
body
.Index("someIndex")
.Query(
query =>
query.QueryString(
qs => qs.
OnFields(f => f.Title, f => f.Description)
.Query(searchTerm + "*"))));
但现在我需要为某个用例的查询添加额外的条件。
What I need is not only to query by [searchTerm]*
but also two
other fields matching:
- searchTerm + "*"
- field1 = "some string"
- field2 = "some Guid"
我确定在弹性搜索中一定有一种方法可以做到这一点(使用 Nest
),但我没能找到它。
我知道我可以将两个附加字段添加到索引中(如 someIndex_field1_field2
),这对我来说绝对是一个选择,因为 field1 和 field2 是合适的分区(事实上,它可能是一个允许更好分区的更好选择)但我只是想看看是否有办法避免这样做,而是是否可以向查询添加多个条件。
有人知道如何实现吗?
非常感谢,
假设 field1
和 field2
只是另一个字段,如 Title
和 Description
,您可以使用 bool must
查询来实现您想要的。
var searchResults = _client.Search<MyIndexable>(s => s
.Query(q => q
.Bool(b => b
.Must(
subQuery => subQuery.QueryString(qs => qs.OnFields(f => f.Title, f => f.Description).Query(searchTerm + "*"")),
subQuery => subQuery.Term(f => f.field1, "some string"),
subQuery => subQuery.Term(f => f.field2 , "some Guid")))));
我正在使用 Nest
连接到 ElasticSearch 并执行一些查询。到目前为止,我已经能够通过如下所示的单个通配符查询获得我要求的结果:
var searchResults = _client.Search<MyIndexable>(
body =>
body
.Index("someIndex")
.Query(
query =>
query.QueryString(
qs => qs.
OnFields(f => f.Title, f => f.Description)
.Query(searchTerm + "*"))));
但现在我需要为某个用例的查询添加额外的条件。
What I need is not only to query by
[searchTerm]*
but also two other fields matching:
- searchTerm + "*"
- field1 = "some string"
- field2 = "some Guid"
我确定在弹性搜索中一定有一种方法可以做到这一点(使用 Nest
),但我没能找到它。
我知道我可以将两个附加字段添加到索引中(如 someIndex_field1_field2
),这对我来说绝对是一个选择,因为 field1 和 field2 是合适的分区(事实上,它可能是一个允许更好分区的更好选择)但我只是想看看是否有办法避免这样做,而是是否可以向查询添加多个条件。
有人知道如何实现吗?
非常感谢,
假设 field1
和 field2
只是另一个字段,如 Title
和 Description
,您可以使用 bool must
查询来实现您想要的。
var searchResults = _client.Search<MyIndexable>(s => s
.Query(q => q
.Bool(b => b
.Must(
subQuery => subQuery.QueryString(qs => qs.OnFields(f => f.Title, f => f.Description).Query(searchTerm + "*"")),
subQuery => subQuery.Term(f => f.field1, "some string"),
subQuery => subQuery.Term(f => f.field2 , "some Guid")))));