Nest ElasticSearch:使用嵌套查询和嵌套对象的布尔搜索
Nest ElasticSearch: Boolean Search using Nested Query and Nested Objects
我正在使用 Nest Elastic 并使用 Head 插件构建布尔搜索查询,我正在组合多个查询
Notes about DB Structure and Elastic Mapping
- 数据库中的每个文档都链接到特定的 profileId
反过来有多个属性
- 每个文档都有多个与之关联的属性值
在此查询中,我试图获取所有具有特定配置文件和属性值 > 30 的文档,请记住该属性应仅具有属性 ID 2。
SQL查询:
Select av.*, d.name from document d inner join attributeValue av
在
d.DocumentId = av.DocumentId
其中 d.profileid = 1 且 av.AttributeId = 2 且 av.Intvalue >30
Elastic Query
{ "query": {
"bool": {
"must": [
{
"term": { "Document.profileid": "1" }
}
,
{
"term": {"Document.lstChildren.AttributeID": "2" }
}
,
{
"range": { "Document.lstChildren.IntValue": { "gt": "30"} }
}
,
{
"match_all": { }
}
],
"must_not": [ ],
"should": [ ]
}
}, "from": 0, "size": 10, "sort": [ ], "facets": { }
}
Problem
结果还包含具有以下属性值的文档
- 属性值 = 3 和 attributeId = 2(值 < 30)
- 属性值 = 34 但 attributeId 不同于 2 (不正确)
不能包含此文档,因为它不能满足我的需要。
我如何构建这个查询?
解决方案是首先通过使 lstChildren 成为嵌套对象来更改映射。然后使用嵌套查询将确保满足指定的所有条件。下面的嵌套查询指定了 returns 仅预期结果的两个条件,但为了保持简单,我使用 "Equal" 而不是 "greater than" 作为 "IntValue":
{
"query": {
"nested": {
"path": "lstChildren",
"query": {
"bool": {
"must": [
{
"match": {
"lstChildren.AttributeID":"2"
}
},
{
"match": {
"lstChildren.IntValue": "31"
}
}
]
}
}
}
}
}
我正在使用 Nest Elastic 并使用 Head 插件构建布尔搜索查询,我正在组合多个查询
Notes about DB Structure and Elastic Mapping
- 数据库中的每个文档都链接到特定的 profileId 反过来有多个属性
- 每个文档都有多个与之关联的属性值
在此查询中,我试图获取所有具有特定配置文件和属性值 > 30 的文档,请记住该属性应仅具有属性 ID 2。
SQL查询:
Select av.*, d.name from document d inner join attributeValue av 在 d.DocumentId = av.DocumentId 其中 d.profileid = 1 且 av.AttributeId = 2 且 av.Intvalue >30
Elastic Query
{ "query": {
"bool": {
"must": [
{
"term": { "Document.profileid": "1" }
}
,
{
"term": {"Document.lstChildren.AttributeID": "2" }
}
,
{
"range": { "Document.lstChildren.IntValue": { "gt": "30"} }
}
,
{
"match_all": { }
}
],
"must_not": [ ],
"should": [ ]
}
}, "from": 0, "size": 10, "sort": [ ], "facets": { }
}
Problem
结果还包含具有以下属性值的文档
- 属性值 = 3 和 attributeId = 2(值 < 30)
- 属性值 = 34 但 attributeId 不同于 2 (不正确)
不能包含此文档,因为它不能满足我的需要。
我如何构建这个查询?
解决方案是首先通过使 lstChildren 成为嵌套对象来更改映射。然后使用嵌套查询将确保满足指定的所有条件。下面的嵌套查询指定了 returns 仅预期结果的两个条件,但为了保持简单,我使用 "Equal" 而不是 "greater than" 作为 "IntValue":
{
"query": {
"nested": {
"path": "lstChildren",
"query": {
"bool": {
"must": [
{
"match": {
"lstChildren.AttributeID":"2"
}
},
{
"match": {
"lstChildren.IntValue": "31"
}
}
]
}
}
}
}
}