【发布时间】:2021-03-01 16:32:03
【问题描述】:
我的对象看起来像这样
{
"country_id":3,
"user_id":22,
"name": "John",
"surname": "Wright",
"city_name":"Sydney",
}
我想这样做:
SELECT * FROM STUDENT WHERE user_id= :1 AND country_id= :2
AND LOWER(name) LIKE '%' || :3 || '%'
OR LOWER(surname) LIKE '%' || :4 || '%'
OR LOWER(city_name) LIKE '%' || :5 || '%'
OFFSET :6 ROWS FETCH NEXT :7 ROWS ONLY
我尝试了以下方法:
curl -XPOST "http://xxx.xxx.xxx.x:9200/xxxx/students/_search" -d '{
"from": 6, "size": 11,
"query": {
"bool": {
"must": [
{
"term": {
"country_id": "123"
},
{
"term": {
"user_id": "abc35"
}
},
{
"query_string": {
"query": "name:*abc*",
"query": "surname:*abc*",
"query": "city_name:*abc*",
}
}
]
}
}
}
用户的搜索字符串将应用于名称、姓氏、城市名称等字段。
有人可以指出我缺少什么吗?我想要尽可能小的查询,因为可以在查询字符串中传递多个字段,以便应用用户的搜索查询(如学校名称、爱好、教育)。
【问题讨论】:
-
另外值得注意的是,运行前缀通配符查询效率不高,并且可能会根据您拥有的数据量影响集群的性能。您应该看看使用
wildcardfield type 是否对您的用例更有利。 -
@noobie 我添加了通配符样式查询和其他方法的一些链接。让elasticsearch大放异彩,尽量避免like%风格的查询。欢呼
标签: elasticsearch elastic-stack