1、SearchAPI
ES支持两种基本方式检索:
-
一个是通过使用 REST request URI 发送搜索参数(uri+检索参数)
GET bank/_search?q=*&sort=account_number:asc
-
另一个是通过使用 REST request body 来发送它们(uri+请求体)
GET bank/_search
{
"query": {
"match_all": {}
}
, "sort": [
{
"account_number": {
"order": "asc"
}
}
]
}
以上内容只是一个简单的应用,具体的需要查看官方文档
以下内容只是列出了一些核心功能,没有语法说明
2、Query DSL
ElasticSearch提供了一个可以执行查询的json风格的DSL(domain-specific language 领域特定语言)。这个被称为Qquery DSL。该语言非常全面,并且刚开始的时候感觉有点复杂,真正学好它的方法是从一些基础的是示例开始的。
3、aggregations(执行聚合)
聚合提供了从数据中心分组和提取数据的能力。最简单的聚合方法大致等于SQL GROUP BY和SQL聚合函数。在ElasticSearch中,有执行搜索返回hits(命中结果),并且同事返回聚合结果,把一个响应中的所有hits(命中结果)分隔开的能力。这是非常强大且有效的,可以执行查询和多个聚合,并且在一次使用中得到各自的(任何一个的)返回结果,使用一次简洁和简化的API来避免网络往返。
4、Mapping
映射,我们可以自定义属性的类型,数据迁移等操作,支持的数据类型如下
5、分词
一个tokenizer(分词器)接收一个字符流,将之分隔为独立的tokens(词元,通常是独立的单词),然后输出tokens流。
例如,whitespace tokenizer遇到空白字符时分隔文本,它会将文本“Quick brown fox!” 分隔为[Quick,brown,fox!]。
该tokenizer(分词器)还负责记录各个term(词条)的顺序或position位置(用于phrase短语和word proximity词近邻查询),以及term(词条)锁代表的原始word(单词)的start(起始)和end(结束)的character offsets(字符偏移量)(用于高亮显示搜索的内容)。
ElasticSearch提供了很多内置的分词器,可以用来构建custom analyzers(自定义分词器)
使用ES内置的分词器执行
POST _analyze
{
"analyzer": "standard",
"text": "我是中国人"
}
效果如下
{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "<IDEOGRAPHIC>",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "<IDEOGRAPHIC>",
"position" : 1
},
{
"token" : "中",
"start_offset" : 2,
"end_offset" : 3,
"type" : "<IDEOGRAPHIC>",
"position" : 2
},
{
"token" : "国",
"start_offset" : 3,
"end_offset" : 4,
"type" : "<IDEOGRAPHIC>",
"position" : 3
},
{
"token" : "人",
"start_offset" : 4,
"end_offset" : 5,
"type" : "<IDEOGRAPHIC>",
"position" : 4
}
]
}
它会把每一个汉字都转换成一个词,因为内置的只支持英文单词的分词,所以我们下载支持中文的分词器
-
安装ik分词器
注意:不能用默认elasticsearch-plugin install xxx.zip 进行自动安装
我们打开github,找到对应版本的分词器,网址如下
https://github.com/medcl/elasticsearch-analysis-ik/releases
找到我们对应的版本号 7.4.2进行下载
解压到我们安装ES的plugins文件中,切换到/mydata/elasticsearch/plugins目录
#创建一个目录,存放下载来的分词器文件 mkdir elasticsearch-analysis-ik #解压zip文件到 elasticsearch-analysis-ik 目录 unzip elasticsearch-analysis-ik-7.4.2.zip -d elasticsearch-analysis-ik # 重启elasticsearch docker restart elasticsearch
-
在kibana中进行测试
POST _analyze { "analyzer": "ik_max_word", "text": "我是中国人" }
结果如下
{ "tokens" : [ { "token" : "我", "start_offset" : 0, "end_offset" : 1, "type" : "CN_CHAR", "position" : 0 }, { "token" : "是", "start_offset" : 1, "end_offset" : 2, "type" : "CN_CHAR", "position" : 1 }, { "token" : "中国人", "start_offset" : 2, "end_offset" : 5, "type" : "CN_WORD", "position" : 2 }, { "token" : "中国", "start_offset" : 2, "end_offset" : 4, "type" : "CN_WORD", "position" : 3 }, { "token" : "国人", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 4 } ] }
这个效果也不是太好,没有按照我们想要的分词来进行分词,所以我们可以自定义分词器
-
自定义词库
-
首先我们把ES的内存调整的大一点
#先停止ES
docker stop elasticsearch
#移除ES
docker rm elasticsearch
#然后执行以下命令
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
-
接着安装nginx
-
随便启动一个nginx实例,只是为了复制出配置文件
#创建nginx文件夹
cd /mydata
mkdir nginx
#创建nginx镜像
docker run -p 80:80 --name nginx -d nginx:1.10- 将容器内的配置文件拷贝到/mydata的目录 ```shell #需要注意后面的. docker container cp nginx:/etc/nginx .
-
修改文件名称
#把nginx文件夹修改为conf文件夹 mv nginx conf #然后重新创建一个nginx文件夹 mkdir nginx #把conf文件夹移动到nginx文件夹下 mv conf nginx/
-
终止原容器
docker stop nginx
-
执行命令删除原容器
docker rm nginx
-
创建新的nginx,执行以下命令
docker run -p 80:80 --name nginx \ -v /mydata/nginx/html:/usr/share/nginx/html \ -v /mydata/nginx/logs:/var/log/nginx \ -v /mydata/nginx/conE:/etc/nginx \ -d nginx:1.10
-
找到nginx/html目录
#切换到html目录 cd /mydata/nginx/html #创建一个目录,用于存放es相关的内容 mkdir es #进入es目录 cd es #创建一个txt文件,用于存放我们分词的数据 vi fenci.txt
-
打开文件后,编译以下内容
我是 中国人
-
让nginx随系统一起启动
docker update nginx --restart=always
-
修改/mydata/elasticsearch/plugins/elasticsearch-analysis-ik/config/中的IKAnalyzer.cfg.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IK Analyzer 扩展配置</comment> <!--用户可以在这里配置自己的扩展字典 --> <entry key="ext_dict"></entry> <!--用户可以在这里配置自己的扩展停止词字典--> <entry key="ext_stopwords"></entry> <!--用户可以在这里配置远程扩展字典,主要修改下面这一行为我们配置的nginx地址+分词文件路径 --> <entry key="remote_ext_dict">http://192.168.56.10/es/fenci.txt</entry> <!--用户可以在这里配置远程扩展停止词字典--> <!-- <entry key="remote_ext_stopwords">words_location</entry> --> </properties>
-
重启ES
docker restart elsaticsearch
#效果如下,我是 中国人 { "tokens" : [ { "token" : "我是", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 0 }, { "token" : "中国人", "start_offset" : 2, "end_offset" : 5, "type" : "CN_WORD", "position" : 1 }, { "token" : "中国", "start_offset" : 2, "end_offset" : 4, "type" : "CN_WORD", "position" : 2 }, { "token" : "国人", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 3 } ] }
-
是不是很好玩呢?看到这里说明你已经有了一定的ES基础了,下面我们在程序中使用ES提供的功能