boot接入elasticsearch

参考博客:https://blog.csdn.net/li521wang/article/details/83792552

项目源码demo:https://github.com/huanghuizhou/elasticsearch-demo

1 es相关安装

1.1 elasticsearch 安装

zip下载地址 https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-4-2

es不支持root用户启动,创建es用户在bin下启动es

 #创建用户并设置密码
useradd esuser -p espassword
#给esuser用户授权
chown -R esuser:esgroup /usr/local/elasticsearch-6.2.4
#切换用户
su esuser
#启动es
./elasticsearch

1.2 es analyzer-ik 中文分词安装

命令行安装 ,下载完后移到/plugins/analyzer-ik 目录。若没有analyzer-ik 目录手动新建。

./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.2/elasticsearch-analysis-ik-6.4.2.zip

直接下载ziphttps://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.2/elasticsearch-analysis-ik-6.4.2.zip 手动解压到/plugins/analyzer-ik 目录

安装完后重启 es

1.3 elasticsearch-head 安装

由于head插件本质上还是一个nodejs的工程,因此需要安装node,使用npm来安装依赖的包。

下载head插件

git clone https://github.com/mobz/elasticsearch-head.git

npm 初始化并启动

npm install
npm install -g grunt --registry=https://registry.npm.taobao.org
npm run start

修改es配置文件,支持跨域访问,在config/elasticseach.yml下新增。

# 是否支持跨域
http.cors.enabled: true # *表示支持所有域名
http.cors.allow-origin: "*"

重启es,然后访问 localhost:9100。如下图所示:

1.4 使用logstash 实现mysql与es同步

下载zip https://artifacts.elastic.co/downloads/logstash/logstash-6.4.2.tar.gz

在myes目录下新建 mysql.conf

input {
stdin {
}
jdbc {
# mysql 数据库链接,shop为数据库名
jdbc_connection_string => "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false"
# 用户名和密码
jdbc_user => "root"
jdbc_password => "123456"
# 驱动
jdbc_driver_library => "/Users/logstash-6.4.2/myes/mysql-connector-java-5.1.40.jar"
# 驱动类名
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
# 执行的sql 文件路径+名称
statement_filepath => "/Users/logstash-6.4.2/myes/user.sql"
# 设置监听间隔 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
# 索引类型
type => "doc"
}
} filter {
json {
source => "message"
remove_field => ["message"]
}
} output {
elasticsearch {
hosts => ["localhost:9200"]
index => "testindex"
document_id => "%{id}"
}
stdout {
codec => json_lines
}
}

在myes目录下新建 test.sql

SELECT
*
FROM
test

把mysql-connector-java-5.1.40.jar 包放到myes下。

然后启动logstash

 ./logstash -f ../myes/mysql.conf

数据如图所示

2 es常用查询手册

match

字段全文搜索

https://www.elastic.co/guide/en/elasticsearch/reference/master/query-dsl-match-query.html

{
"query": {
"match": {
"name": "3c product"
}
}
}

match_phrase

整词完全匹配

https://www.elastic.co/guide/en/elasticsearch/reference/master/query-dsl-match-query-phrase.html

{
"query": {
"match_phrase": {
"name": "Shanghai HB"
}
}
}

match_phrase_prefix

单词前缀匹配(不是字段前缀)

https://www.elastic.co/guide/en/elasticsearch/reference/master/query-dsl-match-query-phrase-prefix.html

{
"query": {
"match_phrase_prefix": {
"name": "Advert"
}
}
}

multi_match

多字段匹配

https://www.elastic.co/guide/en/elasticsearch/reference/master/query-dsl-multi-match-query.html

{
"query": {
"multi_match": {
"query": "shenzhen led",
"fields": [
"name^2",
"business_scope^4",
"registration_location"
]
}
}
}

fuzzy

单词模糊匹配,根据字符串编辑距离https://www.cnblogs.com/BlackStorm/p/5400809.html

https://www.elastic.co/guide/en/elasticsearch/reference/master/query-dsl-fuzzy-query.html

{
"query": {
"fuzzy": {
"name": {
"value": "produtc",
"fuzziness": "AUTO"
}
}
}
}

term

精确匹配

https://www.elastic.co/guide/en/elasticsearch/reference/master/query-dsl-term-query.html

{
"query": {
"term": {
"year_established": 2001
}
}
}

term精确匹配,在对某些被全文索引的字段匹配时,由于字段被分词器分过词,词组被分割,有时候没法精确匹配到比如"input string"这个词,会被分词器分成input和string两个词存储在索引里,term就没法通过"input string"搜索到,因为索引里没有"input string",只有input和string

bool

组合条件查询

https://www.elastic.co/guide/en/elasticsearch/reference/master/query-dsl-bool-query.html

{
"query": {
"bool": {
"must": [
{
"match": {
"name": "Shenzhen"
}
},
{
"term": {
"year_established": "2001"
}
}
]
}
}
}
  • and => must
  • or => should
  • not => must_not

function_score

自定义评分规则

https://www.elastic.co/guide/en/elasticsearch/reference/master/query-dsl-function-score-query.html

{
"query": {
"function_score": {
"query": {
"match": {
"name": "shenzhen product"
}
},
"functions": [
{
"field_value_factor": {
"field": "num_viewed",
"modifier": "log1p",
"factor": "1"
}
},
{
"field_value_factor": {
"field": "level",
"modifier": "square",
"factor": "10"
}
}
]
}
}
}

相关度控制: http://wiki.great-tao.com/xwiki/bin/view/Main/JAVA开发/公共资源说明/Elasticsearch/相关度控制/

highlight

返回结果高亮

https://www.elastic.co/guide/en/elasticsearch/reference/master/search-request-highlighting.html

{
"query": {
"fuzzy": {
"name": {
"value": "produtc",
"fuzziness": "AUTO"
}
}
},
"_source": [
"name"
],
"highlight": {
"pre_tags": "<em>",
"post_tags": "</em>",
"fields": {
"name": {}
}
}
}

附录

3 项目demo

项目源码demo:https://github.com/huanghuizhou/elasticsearch-demo

swagger-ui如下图

实现了简单的增删该查,中文分词,自定义权重查询等。

4 注意点

4.1

match_phrase 匹配条件:

1).match_phrase先分词后去搜的

2).目标文档需要包含分词后的所有词

3).目标文档还要保持这些词的相对顺序和文档中的一致

term 匹配条件:

1).term不做分词。如果使用term查询,要确保字段是no analyzed的。建索引的时候要注意。

例1:

建索引时使用 ik_max_world 分词。 插入一条数据 name:王富贵
这时会把它分词为 [王,富贵]
使用match_phrase 匹配时 输入 '王富' 则匹配不到。'王富' 分词为[王,富]。 只有 {王 ,富贵,王富贵} 可以匹配到。
同理使用term 匹配时 只有 {王 ,富贵} 可以匹配到。
使用match 匹配时,只要带有 '王','富贵'的任意短语都可以匹配到。 例如{*王*,*富贵*,*王*富贵*.......}

例2:

建索引时不使用中文分词。 插入一条数据 name:王富贵
这时默认分词器会把它分词为 [王,富,贵]
使用match_phrase 匹配时{王,富,贵,王富,富贵,王富贵} 可以匹配到。
同理使用term 匹配时 只有 {王 ,富,贵} 可以匹配到。
使用match 匹配时,只要带有 '王','富','贵'的任意短语都可以匹配到。 例如{*王*,*富*,*贵*.......}

看业务需求选择是否使用中文分词。字段字符数少,且常出现不连贯的中文,例如姓名、行星名等字段不建议使用中文分词。

4.2

logstash 同步mysql数据到es时,并不会同步del操作。也就是mysql中删除后es并不会删除。

方案:

  • 1.新增字段status 0:未删除 1:删除。 del走update逻辑。 定期删除mysql和es中status为1的数据。
  • 2.手动维护mysql与es关系。手动增删改同步。

logstash 并不会实时同步数据。具体参考配置文件

	 # 设置监听间隔  各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"

因此对于需要实时查询的业务不建议使用logstash同步数据。需手动同步数据。使es与mysql数据更新处于一个事务下确保一致性。

boot接入elasticsearch的更多相关文章

  1. Spring Boot整合Elasticsearch

    Spring Boot整合Elasticsearch   Elasticsearch是一个全文搜索引擎,专门用于处理大型数据集.根据描述,自然而然使用它来存储和搜索应用程序日志.与Logstash和K ...

  2. spring boot 整合 elasticsearch 5.x

    spring boot与elasticsearch集成有两种方式.一种是直接使用elasticsearch.一种是使用data中间件. 本文只指针使用maven集成elasticsearch 5.x, ...

  3. 【spring boot】【elasticsearch】spring boot整合elasticsearch,启动报错Caused by: java.lang.IllegalStateException: availableProcessors is already set to [8], rejecting [8

    spring boot整合elasticsearch, 启动报错: Caused by: java.lang.IllegalStateException: availableProcessors ], ...

  4. Elasticsearch学习(3) spring boot整合Elasticsearch的原生方式

    前面我们已经介绍了spring boot整合Elasticsearch的jpa方式,这种方式虽然简便,但是依旧无法解决我们较为复杂的业务,所以原生的实现方式学习能够解决这些问题,而原生的学习方式也是E ...

  5. spring boot与ElasticSearch的集成

    本文主要介绍Spring boot与ElasticSearch的集成,因为Spring boot的教程以及ElasticSearch的学习其他博客可能更优秀,所以建议再看这篇文章前先学习学习一下Spr ...

  6. Spring Boot 集成 Elasticsearch 实战

    最近有读者问我能不能写下如何使用 Spring Boot 开发 Elasticsearch(以下简称 ES) 相关应用,今天就讲解下如何使用 Spring Boot 结合 ES. 可以在 ES 官方文 ...

  7. Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 – <史蒂夫·乔布斯传> 』 运行环境: ...

  8. Spring Boot 整合 elasticsearch

    一.简介 我们的应用经常需要添加检索功能,开源的 ElasticSearch 是目前全文搜索引擎的 首选.他可以快速的存储.搜索和分析海量数据.Spring Boot通过整合Spring Data E ...

  9. ElasticSearch入门3: Spring Boot集成ElasticSearch

    第一步:创建项目elasticsearch 编写pom文件 <?xml version="1.0" encoding="UTF-8"?> <p ...

随机推荐

  1. 配置tomcat,访问端口改为80

    首先:找到tomcat的的config文件夹下的server.xml文件: 编辑server.xml 保存server.xml文件,重启tomcat服务器,即可. 亲测好使.

  2. 解密阿里云Redis助力双十一背后的技术

    摘要: Redis是一个使用范围很广的NOSQL数据库,阿里云Redis同时在公有云和阿里集团内部进行服务,本文介绍了阿里云Redis双11的一些业务场景:微淘社区之亿级关系链存储.天猫直播之评论商品 ...

  3. ubuntu动态加载模块简单模板

    1:简单代码 #include<linux/init.h> #include<linux/module.h> MODULE_LICENSE("GPL"); ...

  4. 解决访问google的问题

    我用的是360安全浏览器. 1.点击扩展,搜索goole 2.可以看到第一个就是谷歌访问助手 3.下载安装 4.点击永久激活之后它会提示你怎么做 5.大概是让你修改主页,修改主页是在选项里,第一个基本 ...

  5. html5--3.9 input元素(8)

    html5--3.9 input元素(8) 学习要点 input元素及其属性 input元素 用来设置表单中的内容项,比如输入内容的文本框,按钮等 不仅可以布置在表单中,也可以在表单之外的元素使用 i ...

  6. 从Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2

    from:https://blog.csdn.net/qq_14845119/article/details/73648100 Inception v1的网络,主要提出了Inceptionmodule ...

  7. 异步执行js脚本——防止阻塞

    JS允许我们修改页面中的所有方面:内容,样式和用户进行交互时的行为. 但是js同样可以阻塞DOM树的形成并且延迟页面的渲染. 让你的js变成异步执行,并且减少不必要的js文件从而提高性能. JavaS ...

  8. codeforces 450B B. Jzzhu and Sequences(矩阵快速幂)

    题目链接: B. Jzzhu and Sequences time limit per test 1 second memory limit per test 256 megabytes input ...

  9. BZOJ_2989_数列&&BZOJ_4170_极光_KDTree

    BZOJ_2989_数列&&BZOJ_4170_极光_KDTree Description "若是万一琪露诺(俗称rhl)进行攻击,什么都好,冷静地回答她的问题来吸引她.对方 ...

  10. Linux wpa_cli 调试方法

    记录一下如何使用wpa_cli来进行wifi调试. 1.启动WLAN (1)加载驱动  打开wifi的时候会加载驱动,关闭则会卸载wifi驱动.手动调试的时候,先调用insmod/rmmod命令加载/ ...