gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:15:36 25 4
gpt4 key购买 nike

如何在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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com