Elasticsearch Java -使用should子句进行搜索

pu82cl6c  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(2)|浏览(177)

我有一个保存在ElasticSearch中的Book模型,它有两个属性minimumAge和maximumAge,这两个属性决定了推荐的图书年龄
我有几个搜索booking的用例。第一个用例是按minimumAge搜索书籍。所以假设用户搜索minimumAge 5,我必须得到所有要求minimumAge为5的书籍或那些没有minimumAge的书籍。
我使用了should子句并设置了一个最小的should子句来满足查询,如下所示

private void addSearchByMinimumAge(ProductsFilter filter, BoolQueryBuilder rootQuery) {
    BoolQueryBuilder minAgeQuery = boolQuery();
    minAgeQuery.minimumShouldMatch(1);
    minAgeQuery.should(rangeQuery("minAge").lte(filter.getMinAge()));

    BoolQueryBuilder minAgeNotExistsQuery = boolQuery();
    minAgeNotExistsQuery.mustNot(existsQuery("minimumAge"));
    minAgeQuery.should(minAgeNotExistsQuery);
    rootQuery.must(minAgeQuery);
  }

如上所述,用例工作正常。
我尝试实现的第二个用例是按年龄获取书籍。例如,如果一个人搜索5岁,我需要所有的书籍,其中

  • 年龄5介于或等于minAge和maxAge。
  • 如果minAge和maxAge都不适用于一本书,我仍然应该归还这本书。
  • 如果某本书的minAge为空,但maxAge小于或等于5,则应返回该书。
  • 最后,如果maxAge为空,则还应返回minAge大于或等于5的所有图书。
{ "name" : "Book1" , "minAge": 3 , "maxAge": 8 }
{ "name" : "Book2" , "minAge": 6 , "maxAge": 8 }
{ "name" : "Book3" , "minAge": 3 , "maxAge": 5 }
{ "name" : "Book4" , "minAge": 5 , "maxAge": 8 }
{ "name" : "Book5" }
{ "name" : "Book6" , "minAge": 3 }
{ "name" : "Book7" , "minAge": 6 }
{ "name" : "Book8" , "maxAge": 6 }
{ "name" : "Book9" , "maxAge": 4 }

在上面的数据集中,如果我通过,则图书1、3、4、5、6、8是有效的图书结果
因此,我陷入了什么是紧凑查询来解决这个特定的情况。我的第一个想法过程类似于第一个查询,但四个should子句和匹配任何1。任何指针都将受到欢迎

x0fgdtte

x0fgdtte1#

您必须在should子句中写入每个案例以满足所有场景。下面的弹性查询将涵盖您的所有要求-

{
  "query": {
    "bool": {
      "should": [
        {
          "bool" : {
             "must" : [
               {
                 "range": {
                   "minAge": {
                     "lte": 5
                    }
                  }
               },
               {
                 "range": {
                    "maxAge": {
                      "gte": 5
                     }
                  }
               }
             ] 
          } 
        },
        {
          "bool": {
            "must_not": [
              {
                "exists": {
                  "field": "minAge"
                }
              },
              {
                "exists": {
                  "field": "maxAge"
                }
              }
            ]
          }
        }, 
        {
          "bool" : {
              "must" : [
                {
                 "range": {
                   "minAge": {
                     "lte": 5
                    }
                  }
                },
                {
                  "bool" : {
                     "must_not" : {
                         "exists" : {
                            "field" : "maxAge" 
                          } 
                      } 
                   } 
                } 
              ] 
           } 
        }, 
        {
          "bool" : {
              "must" : [
                {
                 "range": {
                   "maxAge": {
                     "gte": 5
                    }
                  }
                },
                {
                  "bool" : {
                     "must_not" : {
                         "exists" : {
                            "field" : "minAge" 
                          } 
                      } 
                   } 
                } 
              ] 
           } 
        } 
      ]
    }
  }
}
whlutmcx

whlutmcx2#

你可以使用下面的ElasticSearch查询,它将为您的要求工作。我希望你将能够在Java中创建查询。

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "range": {
                  "minAge": {
                    "lte": 5
                  }
                }
              },
              {
                "range": {
                  "maxAge": {
                    "gte": 5
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must_not": [
              {
                "exists": {
                  "field": "minAge"
                }
              },
              {
                "exists": {
                  "field": "maxAge"
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "range": {
                  "maxAge": {
                    "gte": 5
                  }
                }
              },
              {
                "bool": {
                  "must_not": {
                    "exists": {
                      "field": "minAge"
                    }
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "range": {
                  "minAge": {
                    "lte": 5
                  }
                }
              },
              {
                "bool": {
                  "must_not": {
                    "exists": {
                      "field": "maxAge"
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

相关问题