全文搜索
属于最常见的需求,开源的 Elasticsearch
是目前全文搜索引擎的首选。
一、Elasticsearch概述
官方介绍:Elasticsearch 是一个分布式
、RESTful
风格的搜索和数据分析
引擎,能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。
Elasticsearch 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。
ELK:Elasticsearch、Logstash、Kibana
二、核心概念
物理设计
在后台把每个索引划分成多个分片
逻辑设计
索引
相当于数据库中的表
类型
mapping
文档
相当于数据库的一条记录
倒排索引
三、IK分词器
分词:即把一段中文划分为词
Elasticsearch的一个插件
提供了两个分词算法:ik_smart
和ik_max-word
,其中ik_smart
是最小划分,ik_max-word
是最细粒度划分
GET _analyze
{
"analyzer":"ik_smart",
"text":"超级喜欢狂神说Java"
}
ik分词器增加自己的配置字典
四、Rest风格操作
method | url地址 | 描述 |
---|---|---|
PUT | /索引名称/类型文档/文档id | 创建文档(指定文档id) |
索引的基本操作
创建索引
PUT /test1/type1/1
{
"name": "狂神说",
"age": 3
}
指定类型
PUT /test2
{
"mapping": {
"properties": {
"name": {
"type": "text"
},
}
}
}
如何文档字段没有指定类型,es会给我们默认配置字段类型
获得集群信息
GET _cat/
修改文档信息
POST /test3/_doc/1/_update
{
"doc": {
"name": "法外狂徒张三"
}
}
加_update的好处是不传的参数不会被覆盖
删除索引
DELETE test1
文档的基本操作
简单的条件查询
GET /kuangshen/user/_search?q=name:狂神说
复杂查询
GET kuangshen/user/_search
{
"query": {
"match": {
"name": "狂神"
}
}
}
指定字段,结果过滤
GET kuangshen/user/_search
{
"query": {
"match": {
"name": "狂神"
}
},
"_source": ["name", "desc"]
}
排序
GET kuangshen/user/_search
{
"query": {
"match": {
"name": "狂神"
}
},
"sort": [
{
"age": {
"order": "asc"
}
}
]
}
分页查询
from:从第几个数据开始
size:返回多少条数据(单页面的数据)
GET kuangshen/user/_search
{
"query": {
"match": {
"name": "狂神"
}
},
"sort": [
{
"age": {
"order": "asc"
}
}
],
"from": 0,
"size": 1
}
多条件精确查询
must:所有的条件都要符合,对应于数据库中的and
should:只要有一个条件符合
must_not:对应not
GET kuangshen/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "狂神说"
},
"match": {
"age": 23
}
}
]
}
},
"_source": ["name", "desc"]
}
过滤操作
GET kuangshen/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "狂神说"
}
}
],
"filter": {
"range": {
"age": {
"gte": 10,
"lt": 25
}
}
}
}
},
}
匹配条件查询
GET kuangshen/user/_search
{
"query": {
"match": {
"tags": "男 技术"
}
},
}
精确查询
term:直接精确查询(倒排索引)
match:会使用分词器解析(先分析文档,然后通过分析的文档进行查询)
keyword类型不会被分词器解析,text类型会被分词器解析
GET testdb/_search
{
"query": {
"term": {
"name": "狂"
}
}
}
高亮查询
GET kuangshan/user/_search
{
"query": {
"match": {
"name": "狂神"
}
},
"highlight": {
"pre_tags": "<p class='key' style='color:red'>",
"post_tags": "</p>",
"fields": {
"name": {}
}
}
}