elasticsearch - 如何搜索结果一定不能两个值之和?

标签 elasticsearch

如何在elasticsearch中为以下内容编写正确的查询:

phoneNumber != phoneCode + phone

最佳答案

假设字段的类型为text,并且具有同级的等效keyword类型,我共享了一个示例映射,示例文档确认了该映射以及下面的必需查询:

制图

PUT phone
{  
   "mappings":{  
      "mydocs":{  
         "properties":{  
            "phone":{  
               "type":"text",
               "fields":{  
                  "keyword":{  
                     "type":"keyword",
                     "ignore_above":256
                  }
               }
            },
            "phoneCode":{  
               "type":"text",
               "fields":{  
                  "keyword":{  
                     "type":"keyword",
                     "ignore_above":256
                  }
               }
            },
            "phoneNumber":{  
               "type":"text",
               "fields":{  
                  "keyword":{  
                     "type":"keyword",
                     "ignore_above":256
                  }
               }
            }
         }
      }
   }
}

样本文件
POST phone/mydocs/1
{
  "phoneNumber": "9654231010",
  "phoneCode": "0044",
  "phone": "9654231010"
}

POST phone/mydocs/2
{
  "phoneNumber": "00449654231010",
  "phoneCode": "0044",
  "phone": "9654231010"
}

查询:
POST phone/_search
{  
   "query":{  
      "bool":{  
         "must":[  
            {  
               "script":{  
                  "script":"""
                  String phoneNumber = doc['phoneNumber.keyword'].value;
                  String phoneCode = doc['phoneCode.keyword'].value;
                  String phone = doc['phone.keyword'].value;

                  if(phoneNumber!=null && phoneCode!=null && phone!=null){
                    return phoneNumber != phoneCode + phone;
                  }
                  """
               }
            }
         ]
      }
   }
}

我已经在Script Query内使用Bool Query实现了您想要的条件。运行上面的查询,应该只获取具有id:1的文档

现在,我还假定phoneNumberphoneCode的值中没有hypen -或将其用作它们之间的分隔符,如以下示例所示
phoneNumber: 0044-965-423-1010
phoneCode: 0044
phone: 965-423-1010

如果这就是您的值,则可能要在脚本中使用contains()方法,如下所示:
POST phone/_search
{  
   "query":{  
      "bool":{  
         "must":[  
            {  
               "script":{  
                  "script":"""
                  String phoneNumber = doc['phoneNumber.keyword'].value;
                  String phoneCode = doc['phoneCode.keyword'].value;
                  String phone = doc['phone.keyword'].value;

                  if(phoneNumber!=null && phoneCode!=null && phone!=null){
                    return !(phoneNumber.contains(phoneCode) && phoneNumber.contains(phone));
                  }
                  """
               }
            }
         ]
      }
   }
}

希望这可以帮助。

关于elasticsearch - 如何搜索结果一定不能两个值之和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55777448/

相关文章:

elasticsearch - 我可以从Kibana可视化中获取消息吗?

elasticsearch - 如何在匹配所有项目的嵌套对象的数组中搜索

elasticsearch - 为什么自动删除索引策略在elasticsearch中不起作用?

elasticsearch - 在script_score中使用嵌套值

elasticsearch - 在 elasticsearch 中使用现有字段作为 id

java - Liferay 7.3.5GA6自定义索引搜索和ddmFieldArray

java - Elasticsearch 匹配/术语查询不返回完全匹配

elasticsearch - 并非所有结果都包含在父子查询中

mysql - 查询执行完成后自动更改 logstash jdbc 查询

elasticsearch - 更新 elasticsearch 中的 search.max_buckets