1.查询所有
比如match_all,一般测试使用。
2.全文检索
利用分词器对用户输入的内容分词,然后去倒排索引库中去匹配。匹配上了就获得了文档id,根据文档id就拿到文档内容。所以查询的是能分词的字段如text类型。
match
multi_match:等价于copy_to多个字段的值到一个字段all,如上查询。使用copy_to效率更高。
查询的字段越多,查询性能越差。
{
"query": {
"multi_match": {
"query": "万安镇正熙",
"fields": [
"brand",
"name",
"business",
"city",
"starName"
]
}
}
}
3.精确查询
根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等不分词的类型字段。
这些数据类型是不需要做分词的,它们也会去建立倒排索引,就是把它们的内容整体作为一个词条存入到倒排索引。所以用户输入的内容也不需要做分词,直接去跟倒排索引库中匹配。
ids, 根据id精确匹配
range, 根据值的范围查询
term,根据词条精确值查询(用户输入的内容与文档中字段存储的内容完全一致才可以)
应用场景:
搜索酒店,城市、星级、品牌 应该使用term;价格过滤应该使用range范围查询;
4.地理查询
根据经纬度进行查询
geo_distance: 查询到指定中心点小于某个距离值的所有文档。
geo_bouding_box:geo_point点值落在某个矩形范围内的所有文档。
应用场景:
1.地图上搜索附近的酒店。
2.打车搜索附近的车辆。
3.微信搜索附近的人。
5.复合查询
可以将上述各种查询条件组合起来,合并查询条件。
bool 布尔查询
是一个或多个查询子句的组合。
组合方式有:
must: 必须匹配每个子查询。== and
should: 选择性匹配子查询。== or
must_not: 必须不匹配,不参与算分(效率更高),== 非,取反
filter: 必须匹配,不参与算分(效率更高)
{
"query": {
"bool": {
"must": [
{
"term": {
"city": "成都"
}
}
],
"should": [
{
"term": {
"brand": "yy"
}
},
{
"term": {
"brand": "xx"
}
}
],
"must_not": [
{
"range": {
"price": {
"gte": 300
}
}
}
],
"filter": [
{
"range": {
"score": {
"gt": 4
}
}
}
]
}
}
}
这里说明一下:should条件中没有一个满足都没关系也会返回数据,而其它必须满足的条件就必须匹配才会返回数据。
当前查询结果 完全正确,系统返回了唯一满足所有强制条件的文档(id=2),低分是因为未命中可选条件(should)。如果命中可选条件,评分才会高。
{
"query": {
"bool": {
"must": [
{
"term": {
"city": "成都"
}
}
],
"should": [
{
"term": {
"brand": "正熙"
}
},
{
"term": {
"brand": "xx"
}
}
],
"must_not": [
{
"range": {
"price": {
"gte": 300
}
}
}
],
"filter": [
{
"range": {
"score": {
"gt": 4
}
}
}
]
}
}
}
查询在成都、价格不超过500、15公里以内的所有酒店的复合查询:
{
"query": {
"bool": {
"must": [
{
"term": {
"city": "成都"
}
}
],
"must_not": [
{
"range": {
"price": {
"gte": 500
}
}
}
],
"filter": [
{
"geo_distance": {
"distance": "15km",
"location": {
"lat": "31.21",
"lon": "121.472"
}
}
}
]
}
}
}
function_score
在搜索文档的时候,会控制相关度算分,控制文档排名,例如:百度竞价
应用场景:比如给了钱的,就让它的算分高些,排名靠前。