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. mysql的事务隔离级别及其使用场景

    1 什么是事务隔离级别 事务隔离指的是事务之间同步关系. 2 食物隔离级别的分类 第一隔离级别,脏读级别 在脏读级别下,第一个事务修改了某个数据,但是还没有提交,第二个事务可以读取到这个未提及的数据. ...

  2. Android笔记之强大的buildConfigField

    在进行项目开发或维护时,经常会遇到调试和发布所用到的参数值不一致的情况 例如,服务器会分测试和正式,为了能方便地更改(自动更换)服务器地址,buildConfigField就派上用场了 以前都是手动更 ...

  3. POJO对象建立规则

    1.所有POJO类属性必须使用包装数据类型,RPC方法的返回值和参数必须使用包装数据类型. 说明:POJO类属性没有初值是提醒使用者在使用时,必须自己显示的进行赋值,任何NPE问题,或者入库检查,都由 ...

  4. 大数据之环境准备系列 ——第二篇 新装VMware 虚拟机 网络配置(NAT模式)

    新安装虚拟机,需要配置网络环境,才可以使用ssh客户端(如xshell)远程登录 和 虚拟机访问Internet. 一. WMware 软件配置 WMware版本号:11.0.0 build-2305 ...

  5. Hibernate总结(转)

    原文:http://blog.csdn.net/yuebinghaoyuan/article/details/7300599 那我们看一下hibernate中整体的内容: 我们一一介绍其中的内容. H ...

  6. 理解vue ssr原理,自己搭建简单的ssr框架

    前言 大多数Vue项目要支持SSR应该是为了SEO考虑,毕竟对于WEB应用来说,搜索引擎是一个很大的流量入口.Vue SSR现在已经比较成熟了,但是如果是把一个SPA应用改造成SSR应用,成本还是有些 ...

  7. 关于Zookeeper

    Zookeeper是分布式协调工具 应用场景 命名服务(注册中心) Dubbo注册中心 分布式配置中心(SpringCloud config)动态管理配置文件信息 消息中间件 事件通知(类似发布订阅) ...

  8. linux应用之Mongodb的安装及配置(centos)

    Mongodb是一种nosql类型的数据库,高性能.易部署.易使用的特点在IT行业非常流行. 下面介绍一下mongodb的安装方式,这里我们是在linux下安装,使用的是centos6.4 64位的, ...

  9. kallsyms

    kallsyms 在v2.6.0的内核中,为了更好地调试内核,引入新的功能kallsyms.kallsyms把内核用到的所有函数地址和名称连接进内核文件,当内核启动后,同时加载到内存中.

  10. HihoCoder 1508 : 剑刃风暴(占位)

    描述 主宰尤涅若拥有一招非常厉害的招式——剑刃风暴,“无论是战士还是法师,都害怕尤涅若的武士刀剑技”. 现在战场上有N名敌对英雄,他们的位置分别为(Xi, Yi),而剑刃风暴的伤害范围是一个半径为R的 ...