elasticsearch 从嵌套查询中筛选记录-弹性搜索
我有嵌套的数组字段,我需要查询和过滤记录。 样品 下面是我如何需要以下条件的查询, 1.其中Name等于要获取的两个[“vanaraj”,“ranjit”] 2.仅为“vanaraj”添加年龄大于25岁的条件 我需要下面这样的查询,但它不起作用elasticsearch 从嵌套查询中筛选记录-弹性搜索,elasticsearch,elasticsearch,我有嵌套的数组字段,我需要查询和过滤记录。 样品 下面是我如何需要以下条件的查询, 1.其中Name等于要获取的两个[“vanaraj”,“ranjit”] 2.仅为“vanaraj”添加年龄大于25岁的条件 我需要下面这样的查询,但它不起作用 { "query": { "bool": { "filter": [ { "nested": { "path": "data.test.name",
{
"query": {
"bool": {
"filter": [
{
"nested": {
"path": "data.test.name",
"query": {
"bool": {
"filter": [
{
"terms": {
"data.test.name.name": ["vanaraj","ranjit"]
}
}
]
}
}
}
},
{
"nested": {
"path": "data.test.name",
"query": {
"bool": {
"filter": [
{
"term": {
"data.test.name.name": "vanaraj"
}
},
{
"range": {
"data.test.name.Age": {
"gt": 25
}
}
}
]
}
}
}
}
]
}
}
}
映射:
{
"mappings":{
"properties":{
"test":{
"properties":{
"name":{
"type":"nested",
"properties":{
"Age":{
"type":"long"
},
"name":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
}
}
}
}
}
}
根据您的进一步说明,以下代码应能帮助您: 解决方案: 更新的解决方案:
POST/\u搜索
{
“查询”:{
“布尔”:{
“应该”:[
{
“嵌套”:{
“路径”:“test.name”,
“查询”:{
“布尔”:{
“必须”:[
{
“匹配”:{
“test.name.name”:“vanaraj”
}
},
{
“范围”:{
“test.name.Age”:{
“gte”:26
}
}
}
]
}
}
}
},
{
“嵌套”:{
“路径”:“test.name”,
“查询”:{
“布尔”:{
“必须”:[
{
“条款”:{
“test.name.name”:[
“abc”,
“兰吉特”
]
}
}
]
}
}
}
}
],
“不得”:[
{
“嵌套”:{
“路径”:“test.name”,
“查询”:{
“布尔”:{
“必须”:[
{
“条款”:{
“test.name.name”:[
“瓦纳拉杰”
]
}
},{
“范围”:{
“test.name.Age”:{
“lte”:25
}
}
}
]
}
}
}
}
]
}
}
}
请运行上面的,让我知道这是否有帮助 这个答案应该有帮助:我需要一个如下的查询,但它不起作用。你能分享你的映射信息吗?在你的查询中,它过滤所有字段的范围,我只需要Vanaraj,年龄>26岁,在你的“abc”情况下,它应该返回两个结果“abc”,年龄=26岁和年龄10岁。因此,如果我理解正确,它应该是检索您有“ranjit”的所有文档,并且(仅当年龄>=26时才检索vanaraj),只有当您的映射是我提到的映射时,上面的查询才会这样做。否则它将不起作用。没有意义,那么为什么有
vanaraj
和age
子句。如果您不考虑年龄
而这样做,则您正在提取所有具有vanaraj
的文档。基本上,得到你想要的东西的唯一方法就是使用我提到的解决方案。您必须后退一步,了解以您希望的方式运行查询时得到的结果。@user2602635请立即尝试更新的解决方案
,并告知met这是否解决了您的问题。我希望这现在能奏效:|我很高兴你找到了解决办法。也可以随意投票;)
{
"mappings":{
"properties":{
"test":{
"properties":{
"name":{
"type":"nested",
"properties":{
"Age":{
"type":"long"
},
"name":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
}
}
}
}
}
}
POST <your_index_name>/_search
{
"query": {
"bool": {
"should": [
{
"nested": {
"path": "test.name",
"query": {
"bool": {
"must": [
{
"match": {
"test.name.name": "vanaraj"
}
},
{
"range": {
"test.name.Age": {
"gte": 26
}
}
}
]
}
}
}
},
{
"nested": {
"path": "test.name",
"query": {
"bool": {
"must": [
{
"match": {
"test.name.name": "ranjith"
}
}
]
}
}
}
}
]
}
}
}
Bool
- Should
- Must clause for name=vanaraj and age >= 26
- Must clause for name=ranjith
POST <your_index_name>/_search
{
"query": {
"bool": {
"should": [
{
"nested": {
"path": "test.name",
"query": {
"bool": {
"must": [
{
"match": {
"test.name.name": "vanaraj"
}
},
{
"range": {
"test.name.Age": {
"gte": 26
}
}
}
]
}
}
}
},
{
"nested": {
"path": "test.name",
"query": {
"bool": {
"must": [
{
"terms": {
"test.name.name": [
"abc",
"ranjit"
]
}
}
]
}
}
}
}
],
"must_not": [
{
"nested": {
"path": "test.name",
"query": {
"bool": {
"must": [
{
"terms": {
"test.name.name": [
"vanaraj"
]
}
},{
"range": {
"test.name.Age": {
"lte": 25
}
}
}
]
}
}
}
}
]
}
}
}