最近的项目用ES做查询服务,感觉蛮有意思的,查询速度也蛮快。
1. ES处理并发的机制
2. ES查询语法
ES可以查询多个字段,例如:查询字段1或字段2中包含xxx的记录,对查询文本的大小写不敏感,&default_operator也可以设置为AND(和)
http://HOST:PORT/INDEX/_search?q=FIELD1:"XXX" FIELD2:"XXX"&default_operator=OR&size=100&pretty
ES可以查询单个字段包含多个查询文本的记录,例如:查询字段1中同时包含AAA,BBB的记录
http://HOST:PORT/INDEX/_search?q=FIELD1:(AAA,BBB)&default_operator=AND&size=100&pretty
ES无法进行既AND又OR的查询,例如:希望返回字段1中同时包含AAA,BBB的记录,或字段2中同时包含AAA,BBB的记录,下面的语法会返回错误的结果
http://HOST:PORT/INDEX/_search?q=FIELD1:(AAA,BBB) FIELD2:(AAA,BBB)&default_operator=OR&size=100&pretty
3. es.search查询
不使用ES的URL进行查询,采用es.search的语法进行查询,重点在于body中的设置,下面语法展示了乱序取指定count的写法。更多的语法见:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
should(OR查询)、must(AND查询)
# select * from TABLE where field1=text order by ???
es = Elasticsearch([HOST + ':' + PORT])
body = {
"size": count,
"query": {
"multi_match": {
"query": text,
"fields": [field1]
}
},
"sort": {
"_script": {
"script": "Math.random()",
"type": "number",
"order": "asc"
}
}
}
result = es.search(index=TABLE, body=body)
# select * from TABLE where label=text1 and (field1=text2 or field2=text2)
es = Elasticsearch([HOST + ':' + PORT])
body = {
"size": count,
"query": {
"bool": {
"must": [
{
# 先满足 label 中包含 "bbb"
"bool": {
"must": {
"match": {
"label": {
"query": text1,
}
}
}
}
},
{
# 再满足 field1 或 field2 中包含 "aaa"
"bool": {
"should": [
{
"match": {
field1: {
"query": text2,
}
}
},
{
"match": {
field2: {
"query": text2,
}
}
},
]
}
}
]
}
}
}
4. ES+bert相似查询
es可以和bert组合起来实现相似内容的查询,例如,查询字段1中包含“春节”的内容,可以查到包含“中秋节”、“清明节”等相似内容的记录。