我试图在SQL中找到等效于IN\的ElasticSearch查询NOT.
我知道我们可以使用带有多个OR的QueryString查询来获得相同的答案,但最终会有大量的OR.
有人可以分享这个例子吗?
pic*_*ypg 77
类似于Chris建议的评论,类似的替换IN是terms 过滤器(查询意味着评分,这可能会改善返回的顺序).
SELECT * FROM table WHERE id IN (1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
等效的Elasticsearch 1.x过滤器将是:
{
"query" : {
"filtered" : {
"filter" : {
"terms" : {
"id" : [1, 2, 3]
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
等效的Elasticsearch 2.x +过滤器将是:
{
"query" : {
"bool" : {
"filter" : {
"terms" : {
"id" : [1, 2, 3]
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
重要的一点是,terms过滤器(以及对此问题的查询)适用于完全匹配.这是一个隐含的or操作,类似于IN.
如果你想反转它,你可以使用not过滤器,但我建议使用稍微更详细bool/ must_not过滤器(以养成使用bool/ must和的习惯bool).
{
"query" : {
"bool" : {
"must_not" : {
"terms" : {
"id" : [1, 2, 3]
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
总的来说,bool复合查询语法是Elasticsearch中最重要的过滤器之一,term(单数)和terms过滤器(复数,如图所示).
1 项
您可以在 ElasticSearch 中使用术语术语查询,该查询将充当 IN
terms 查询用于检查该值是否与以下提供的任何值匹配Array中提供的任何值匹配。
2 不得
在 ElasticSearch 中, must_not可以用作 NOT。
前任。
GET my_index/my_type/_search
{
"query" : {
"bool" : {
"must":[
{
"terms": {
"id" : ["1234","12345","123456"]
}
},
{
"bool" : {
"must_not" : [
{
"match":{
"id" : "123"
}
}
]
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
另外,如果有帮助,您还可以使用“存在”查询来检查该字段是否存在。例如,检查该字段是否存在
"exists" : {
"field" : "mobileNumber"
}
Run Code Online (Sandbox Code Playgroud)
检查字段是否不存在
"bool":{
"must_not" : [
{
"exists" : {
"field" : "mobileNumber"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32528 次 |
| 最近记录: |