Elasticsearch分布式搜索引擎总结2

Elasticsearch分布式搜索引擎总结2

官网: https://www.elastic.co/guide/index.html


一、DSL查询语法

1.查询所有 – match_all

GET /indexName/_search
{
  "query": {
    "match_all": {}
  }
}

2.全文检索 – match /mulit_match

①match 单字段查询

GET /indexName/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT"
    }
  }
}

②mulit_match 多字段查询

GET /indexName/_search
{
  "query": {
    "multi_match": {
      "query": "TEXT",
      "fields": ["FIELD1", " FIELD12"]
    }
  }
}

3.精确查询 – term/range

①term根据词条精确查询

GET /indexName/_search
{
  "query": {
    "term": {
      "FIELD": {
        "value": "VALUE"
      }
    }
  }
}

②range根据值范围查询

GET /indexName/_search
{
  "query": {
    "range": {
      "FIELD": {
        "gte": 10, // 这里的gte代表大于等于,gt则代表大于
        "lte": 20 // lte代表小于等于,lt则代表小于
      }
    }
  }
}

4.地理查询 – geo_bounding_box/geo_distance

①geo_bounding_box 矩形查询

GET /indexName/_search
{
  "query": {
    "geo_bounding_box": {
      "FIELD": {
        "top_left": { // 左上点
          "lat": 31.1, //lat维度
          "lon": 121.5 //lon经度
        },
        "bottom_right": { // 右下点
          "lat": 30.9,
          "lon": 121.7
        }
      }
    }
  }
}

②geo_distance 圆圈查询

GET /indexName/_search
{
  "query": {
    "geo_distance": {
      "distance": "15km", // 半径
      "FIELD": "31.21,121.5" // 圆心(纬经度)
    }
  }
}

5.复合查询 – fuction_score/bool

①fuction_score 算分函数查询,并计算相关性算分(原始算分)

  • 根据原始条件(query)查询搜索文档
  • 根据过滤条件(filter),过滤文档
  • 符合过滤条件的文档,基于算分函数(function_score)运算,得到函数算分
  • 将原始算分和函数算分,用运算模式(boost_mode–multiply/replace/sum…)做运算,得到结果
GET /indexName/_search
{
  "query": {
    "function_score": {
      "query": {//原始算分
        "match_all": {}
      },
      "functions": [
        {
          "filter": {//过滤文档
            "term": {
              "brand": "如家"
            }
          },
          "weight": 10//算分函数
        }
      ],
      "boost_mode": "sum"//运算模式
    }
  }
}

②bool 布尔查询

布尔查询是一个或多个查询子句的组合,每一个子句就是一个子查询
在这里插入图片描述
-注:参与算分的字段越多,查询的性能也越差

GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {"city": "上海" }}
      ],
      "should": [
        {"term": {"brand": "皇冠假日" }},
        {"term": {"brand": "华美达" }}
      ],
      "must_not": [
        { "range": { "price": { "lte": 500 } }}
      ],
      "filter": [
        { "range": {"score": { "gte": 45 } }}
      ]
    }
  }
}

二、搜索结果处理

1.排序

①普通字段排序

GET /indexName/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "FIELD": "desc"  // 排序字段、排序方式ASC、DESC
    }
  ]
}

②地理坐标排序

GET /索引库名称/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_geo_distance" : {
          "FIELD" : "纬度,经度", // 文档中geo_point类型的字段名、目标坐标点
          "order" : "asc", // 排序方式
          "unit" : "km" // 排序的距离单位
      }
    }
  ]
}

2.分页 – from/size

GET /indexName/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0, // 分页开始的位置,默认为0
  "size": 10 // 期望获取的文档总数
}

3.高亮

GET /hotel/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT" // 查询条件,高亮一定要使用全文检索查询
    }
  },
  "highlight": {
    "fields": { // 指定要高亮的字段
      "FIELD": {
        "pre_tags": "<em>",  // 用来标记高亮字段的前置标签
        "post_tags": "</em>" // 用来标记高亮字段的后置标签
      }
    }
  }
}

三、Java中RestClient应用

1.match、term、range、bool查询

①match

searchRequest.source()..query(
                        QueryBuilders.matchQuery("name", "如家")
                );

②term

searchRequest.source().query(
                QueryBuilders.termQuery("price", 159)
        );

③range

 searchRequest.source().query(
                QueryBuilders.rangeQuery("price")
                        .gt(100)
                        .lt(500)
        );

④bool – must/should/mustNot/filter

searchRequest.source().query(
                QueryBuilders.boolQuery()
                        .must(
                                QueryBuilders.matchQuery("name", "如家")
                        )
                        .mustNot(
                                QueryBuilders.rangeQuery("price")
                                        .gt(300)
                        )
        );

2.排序 – sort

方式一:

searchRequest.source().sort("price", SortOrder.ASC)
                .sort("score", SortOrder.DESC);

方式二:

searchRequest.source().sort(
                              Arrays.asList(
                                    SortBuilders.fieldSort("price").order(SortOrder.ASC),
                                     SortBuilders.fieldSort("score").order(SortOrder.DESC)
                            )
                  );

3.分页 --from size

 searchRequest.source().from(10).size(10);

4.高亮 – highlighter

  searchRequest.source().highlighter(
                new HighlightBuilder()
                        .field("name")
                        .preTags("<em>")
                        .postTags("</em>")
                        .requireFieldMatch(false)
        );
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值