Lucene 工作原理
- 处理文本的最高效做法就是:正则匹配。
ElasticSearch 中的基本概念
- 索引: 含有相同属性的文档集合。
- 类型:索引可以定义一个或多个类型,文档必须属于一个类型。
- 文档:文档是可以被索引的基本数据单元。
- 分片:每个索引都有多个分片,每个分片是一个Lucene 索引。
- 备份:拷贝一份分片就完成了分片的备份。
ElasticSearch API 命名风格
- API 基本格式: http://<ip>:<port>/<索引>/<类型>/<文档ID>
- 常用的HTTP 动词:GET/PUT/POST/DELETE
关系型数据库和ElasticSearch 操作姿势对比
ElasticSearch 基本操作
- 创建索引
- 方式一:创建非结构化的索引(如下图所示)。
- 方式二:创建结构化的索引,输入book/novel/_mappings(如下图所示),
- 方式三:可以在Postman 中选择PUT 方法,输入localhost:9200/people,然后在raw 中编辑一下json 信息(如下图):
- 输入的json 内容如下:
-
{ "settings":{ "number_of_shards":3, "number_of_replicas":1 }, "mappings":{ "man":{ "properties":{ "name":{ "type":"text" }, "conutry":{ "type":"keyword" }, "age":{ "type":"integer" }, "date":{ "type":"date", "format":"yyyy-MM-dd HH:mm:ss ||yyyy-MM-dd||epoch_millis" } } }, "woman":{} } }
-
- 方式一:创建非结构化的索引(如下图所示)。
- 插入数据
- 方式一:指定文档ID 插入,在Postman 中使用PUT 方法,输入localhost:9200/people/man/1,在raw 区域输入:
-
{ "name":"Tom", "country":"China", "age":18, "date":"2000-10-11" }
- 执行结果:
-
- 方式二:自动生成文档ID 插入,在Postman 中使用POST 方法,输入localhost:9200/people/man,在raw 区域输入:
-
{ "name":"Tom老师", "country":"China", "age":88, "date":"2000-10-11" }
- 执行结果如下:
-
- 方式一:指定文档ID 插入,在Postman 中使用PUT 方法,输入localhost:9200/people/man/1,在raw 区域输入:
- 修改文档
- 方式一:直接修改文档,打开Postmain,选择POST 方法,输入localhost:9200/people/man/1/_update,运行结果如下:
- 方式二:通过脚本修改文档,在raw 区输入以下内容:
- 所有年龄增加一岁。
-
{ "script":{ "lang":"painless", "inline":"ctx._source.age += 1", } }
-
- 或者输入:修改年龄为30 岁。
-
{ "script":{ "lang":"painless", "inline":"ctx._source.age = params.age", "params":{ "age":30 } } }
-
- 所有年龄增加一岁。
- 方式一:直接修改文档,打开Postmain,选择POST 方法,输入localhost:9200/people/man/1/_update,运行结果如下:
- 删除文档
- 删除文档:打开Postman,选择DELETE 方法,输入localhost:9200/people/man/1,执行结果如下:
- 删除索引,打开Postman 输入localhost:9200/people,执行结果如下:
- 查询语法
- 全表查询:在Postman 中选择GET 方法,输入localhost:9200/book/_search 得到以下结果:
- 条件查询:在Postman 中选择GET 方法,输入localhost:9200/book/_search,然后在raw 区域中编辑如下内容:
- 查询书籍中包含老师关键字,且按年龄降序排序。
-
{ "query":{ "match":{ "name":"老师" } }, "sort":[ {"age":{"order":"desc"}} ] }
- 聚合查询:在Postman 中选择GET 方法,输入localhost:9200/book/_search,然后在raw 区域中编辑如下内容:
- 根据国家和名称进行分组
- 根据国家和名称进行分组
- 聚合统计:在Postman 中选择GET 方法,输入localhost:9200/book/_search,然后在raw 区域中编辑如下内容:
- 根据年龄的字数进行聚合统计。
-
{ "aggs":{ "grades_age":{ "stats":{ "field":"age" } } } }
-
- 根据年龄的字数进行聚合统计。
解决聚合分组没效果::
- people是index、man是类型、country是你需要设置的text字段
ElasticSearch 高级查询
- query 条件:
- 方式一:模糊匹配,在Postman 中选择GET 方法,输入localhost:9200/people/_search,然后在raw 区域中编辑如下内容:
- 注意这里的匹配,你随便输,他自己会切词
-
{ "query":{ "match":{ "name":"Tom小" } } }
-
- 注意这里的匹配,你随便输,他自己会切词
- 方式二:习语匹配查询name中包含”小小”
-
{ "query":{ "match_phrase":{ "name":"小小" } } }
-
- 方式三:多字段匹配查询name和country中都包含”Tom”
-
{ "query":{ "multi_match":{ "query":"Tom", "fields":["name","country"] } } }
-
- 方式三:Query 语法查询查询name和country中同时包含XXX和YYY,或者包含ZZZ。
-
{ "query":{ "query_string":{ "query":"(小 AND USA) OR china", "fields":["name","country"] } } }
-
- 方式四:结构化数据查询
- 查询字数在87到90之间的数据
-
{ "query":{ "range":{ "age":{ "gt":87, "lte":90 } } } }
-
- 查询字数在87到90之间的数据
- 查询2000-10-12 至今 的数据
-
{ "query":{ "range":{ "date":{ "gt":"2000-10-12", "lte":"now" } } } }
-
- filter 条件:
-
{ "query":{ "bool":{ "filter":{ "term":{ "age":98 } } } } }
-
- 复合查询
-
{ "query":{ "bool":{ "must":[ { "match":{ "name":"老师" } }, { "match":{ "country":"China" } } ], "filter":{ "term":{ "age":88 } } } } }
-
- 方式一:模糊匹配,在Postman 中选择GET 方法,输入localhost:9200/people/_search,然后在raw 区域中编辑如下内容:
来源:oschina
链接:https://my.oschina.net/u/3847203/blog/2990097