ElasticSearch (NEST) 中的多项过滤器
Multi-term filter in ElasticSearch (NEST)
我正在尝试根据具有多个可能值的给定字段查询文档。例如,我的文档有一个 "extension" 属性,它是 .docx
、xls
、.pdf
等文件的扩展类型。我想成为能够根据任意数量的值过滤我的 "extensions" 属性,但找不到获得此功能所需的正确语法。这是我当前的查询:
desc.Type("entity")
.Routing(serviceId)
.From(pageSize * pageOffset)
.Size(pageSize)
.Query(q => q
.Filtered(f => f
.Query(qq =>
qq.MultiMatch(m => m
.Query(query)
.OnFields(_searchFields)) ||
qq.Prefix(p1 => p1
.OnField("entityName")
.Value(query)) ||
qq.Prefix(p2 => p2
.OnField("friendlyUrl")
.Value(query))
)
.Filter(ff =>
ff.Term("serviceId", serviceId) &&
ff.Term("subscriptionId", subscriptionId) &&
ff.Term("subscriptionType", subscriptionType) &&
ff.Term("entityType", entityType)
)
)
);
P.S。反过来想可能更容易,我发送我不想要的文件扩展名并设置查询以获取不想要的文件T 具有任何给定的扩展值。
经过讨论,这应该是一个原始的 json 查询,它应该可以工作并且可以很容易地转换为 NEST:
POST /test/_search
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": [
{
"term": {
"serviceId": "VALUE"
}
},
{
"term": {
"subscriptionId": "VALUE"
}
},
{
"term": {
"subscriptionType": "VALUE"
}
},
{
"term": {
"entityType": "VALUE"
}
}
],
"must_not": [
{
"terms": {
"extension": [
"docx",
"doc"
]
}
}
]
}
}
}
}
}
必须做的事情:
为了拥有必须存在的子句和需要过滤掉的子句,bool 查询最适合。
- 必须查询存储 OP 查询中存在的所有子句
- Must_not 查询应该存储所有需要过滤掉的扩展
如果您想要 return 与“.doc”或“.xls”匹配的项目,那么您需要一个 TERMS 查询。这是一个示例:
var searchResult = ElasticClient
.Search<SomeESType>(s => s
.Query(q => q
.Filtered(fq => fq
.Filter(f => f
.Terms(t => t.Field123, new List<string> {".doc", ".xls"})
)
)
)
)
我正在尝试根据具有多个可能值的给定字段查询文档。例如,我的文档有一个 "extension" 属性,它是 .docx
、xls
、.pdf
等文件的扩展类型。我想成为能够根据任意数量的值过滤我的 "extensions" 属性,但找不到获得此功能所需的正确语法。这是我当前的查询:
desc.Type("entity")
.Routing(serviceId)
.From(pageSize * pageOffset)
.Size(pageSize)
.Query(q => q
.Filtered(f => f
.Query(qq =>
qq.MultiMatch(m => m
.Query(query)
.OnFields(_searchFields)) ||
qq.Prefix(p1 => p1
.OnField("entityName")
.Value(query)) ||
qq.Prefix(p2 => p2
.OnField("friendlyUrl")
.Value(query))
)
.Filter(ff =>
ff.Term("serviceId", serviceId) &&
ff.Term("subscriptionId", subscriptionId) &&
ff.Term("subscriptionType", subscriptionType) &&
ff.Term("entityType", entityType)
)
)
);
P.S。反过来想可能更容易,我发送我不想要的文件扩展名并设置查询以获取不想要的文件T 具有任何给定的扩展值。
经过讨论,这应该是一个原始的 json 查询,它应该可以工作并且可以很容易地转换为 NEST:
POST /test/_search
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": [
{
"term": {
"serviceId": "VALUE"
}
},
{
"term": {
"subscriptionId": "VALUE"
}
},
{
"term": {
"subscriptionType": "VALUE"
}
},
{
"term": {
"entityType": "VALUE"
}
}
],
"must_not": [
{
"terms": {
"extension": [
"docx",
"doc"
]
}
}
]
}
}
}
}
}
必须做的事情:
为了拥有必须存在的子句和需要过滤掉的子句,bool 查询最适合。
- 必须查询存储 OP 查询中存在的所有子句
- Must_not 查询应该存储所有需要过滤掉的扩展
如果您想要 return 与“.doc”或“.xls”匹配的项目,那么您需要一个 TERMS 查询。这是一个示例:
var searchResult = ElasticClient
.Search<SomeESType>(s => s
.Query(q => q
.Filtered(fq => fq
.Filter(f => f
.Terms(t => t.Field123, new List<string> {".doc", ".xls"})
)
)
)
)