Elasticsearch笔记_1
ES
支持的两种地理坐标存储形式
geo_point
: 纬度和经度确定的一个点geo_shape
: 多个geo_point
组成的一个复杂图形, 比如直线, 一般是一个区域
- 如果
ES
中同时需要根据名称, 位置, 商圈, 城市等信息进行多个字段的搜索, 又希望性能高一些, 可以使用copy_to
1 | "all": { |
JavaRestClient
初始化
- 引入
ES
的HighLevelRestClient
1 | <dependency> |
- 覆盖
SpringBoot
默认的7.6.2版本设置
1 | <properties> |
- 初始化
RestHighLevelClient
1 | RestHighLevelClient client = new RestHighLevelClient(RestClient.builder( |
创建索引库
1 | void testCreateIndex() throws IOException { |
添加数据到索引库
1 | void IndexDocument() throws IOException { |
查询文档
1 | void GetDocumentById() throws IOException { |
根据ID修改数据
- 全量更新, 直接删除再重新插入数据
- 局部更新
1 | void UpdateDocumentById() throws IOException { |
批量导入数据
- 利用
mybatis-plus
查询数据 - 将查询到的数据转换为文档数据
- 利用
JavaRestClient
中的Bulk
批处理, 实现批量新增文档
1 | void testBulk() throws IOException { |
DSL查询语法
分类
- 查询所有: 有分页, 一次20条,
match_all
- 全文检索: 利用分词器对内容分词后使用倒排索引匹配,
match_query
,multi_match_query
- 精确查询: 根据精确词条查询, 一般是
keyword
, 数值, 日期,boolean
, 不分词,ids
,range
,term
- 地理查询: 根据经纬度查询,
geo_distance, geo_bounding_box
- 复合查询: 将上述查询组合查询,
bool
,function_score
语法
1 | GET /idxName/_search |
全文检索
对用户输入内容分词以后用于搜索框检索
1 | GET /idxName/_search |
精确查询
对不可分词的条件查询
1 | GET /idxName/_search |
地理查询
查询附近的酒店, 打车, 附近的人
1 | // 查询某个geo_point落在矩形框中的文档 |
复合查询
- 在简单查询基础上进行功能叠加,
function_score
算分函数查询, 给相关词条打分, 返回值按照倒序排列 - 如果只使用
TF
算法, 某一个词条可能会在所有文档中都出现, 那计算这个词条的数量就没有意义, 所以产生TF-IDF
算法 - 但是从
ES5.1
开始就没有使用这种TF-IDF
算法了, 使用BM25
算法 - 因为传统算法词频越高,
TF-IDF
算法得分越高,BM25
算法最终会趋于水平
1 | GET /idxName/_search |
1 | // 布尔查询是一个或多个子句组合 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Sangs Blog!