热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ElasticSearch再学习

ElasticSearch参数详解本次使用的windows的版本,如若Linux移步:https:www.cnblogs.commsi-chenp103

ElasticSearch参数详解

本次使用的windows的版本,如若Linux移步:https://www.cnblogs.com/msi-chen/p/10335794.html

配置文件参数

首先我们对ES的解压目录做一个简单的了解:

  

然后就是配置文件目录中的三个配置文件做一个说明:

  • elasticsearch.yml

    点击进去里面的配置全是被注释掉的,我们可以加入下面的数据作为配置

  • jvm.options

    有关JVM属性的配置,一般我们就设置堆的最小最大值,一般设为相等,不能超过物理内存的一半

    -Xms2g -Xmx2g

  • log4j2.properties

    日志文件的配置,ES使用log4j,配置一下日志级别就OK

面向Restful的api接口

  • 创建索引库

    put http://localhost:9200/索引库名称

    • number_of_shards:设置分片的数量,在集群中通常设置多个分片,表示一个索引库将拆分成多片分别存储不同的结点,提高了ES的处理能力和高可用性,入门程序使用单机环境,这里设置为1。

    • number_of_replicas:设置副本的数量,设置副本是为了提高ES的高可靠性,单机环境设置为0.

  • 创建映射

    post http://localhost:9200/索引库名称/类型名称/_mapping

    • 类型名称暂时没有意义存在,随便取一个即可,比如doc这种没有意义的

  • 插入文档

    put 或Post http://localhost:9200/索引库名称/类型名称/文档id

    关于最后的文档id,我们如果有设置就会使用我们自己的,若不设置,ES会自动生成

  • 搜索文档

    根据文档id查询:

    • get http://localhost:9200/索引库名称/类型名称/文档id

    查询所有文档:

    • get http://localhost:9200/索引库名称/类型名称/_search

    根据某个属性的的值插叙:

    • get http://localhost:9200/索引库名称/类型名称/_search?q=name:bootstrap

    • 根据name属性的值为bootstrap进行查询,前面固定格式

  • 查询结果参数解析

    查询结果一般会有如下数据显示

IK分词器

简单上手

ES默认自带的分词器对于中文而言是单字分词,比如我爱祖国,ES会一个字一个字的分词,这样很明显不行

我们查看下面的分词效果

post:localhost:9200/_analyze

{"text":"测试分词器,我爱祖国"}

ES在之前的文件目录说明哪里也有说到,ES是支持插件机制的,我们将IK丢pligins包里就好,记得重启ES

我们手动指定使用的分词器,查看下面的分词效果

post:localhost:9200/_analyze

{"text":"测试分词器,我爱我自己","analyzer":"ik_max_word"}

然后发现好像有点复合我们国人的口味了,这里ik分词有两个模式

  • ik_max_word ,这个就是我们上面使用到的一个模式,划分粒度比较细,一般用于存储的时候,进行分词存储索引

  • ik_smart ,相对而言,这个就要粗旷一些了,一般在检索索引时,对检索条件的字段进行粗旷的分词

    比如:下面这句话的意思就是name属性在索引和在搜索时都是用ik_max_word模式

    "name": { "type": "text", "analyzer":"ik_max_word" }

    再比如:索引时使用“ik_max_word”分词,搜索时使用“ik_smart”提高搜索精确性

    "name": { "type": "text", "analyzer":"ik_max_word", "search_analyzer":"ik_smart" }

自定义词库

有一些特殊的领域是有一些专有的词语的,而Ik是分辨不出来,所以这里需要使用到IK的自定义词库

  • 首先定义我们自己的词库:my.dic

    记得保存为UTF-8格式,不然读取不到

  • 然后我们再配置文件中去加载我们的自定义词库:IKAnalyzer.cfg.xml

  • 然后重启ES,查看分词效果

post:localhost:9200/_analyze

{"text":"死亡野格儿","analyzer":"ik_max_word"}

映射

  • 查询所有索引的映射:

    GET: http://localhost:9200/_mapping

  • 创建映射

    post :http://localhost:9200/索引库名/类型名_mapping

  • 映射一旦创建,已有的映射是不允许更改,只能新增或者删除重建

  • 删除映射也只能通过删除索引来完成

映射的类型_text

核心的字段类型:

映射的类型选好了,还有一些其他的属性可以设置

  • analyzer :通过该属性指定分词器及模式

    name属性的类型为text,在索引时使用“ik_max_word”分词器模式

    在搜索时使用"ik_smart "分词器模式分词

    一般都是建议在索引的时候词语最细化,在搜索时,对搜索条件粗旷化提高搜索精度

  • index:通过该属性指定是否索引,默认为true

    只有在设置为false时,该属性的值是不会存入索引库的,也不会被检索到

    比如pic属性表示的是图片的地址,一般我们不uhi把这个地址作为搜索条件进行检索,故而设置为false

  • store:额外存储,一般不用理会

    是否在source之外存储,每个文档索引后会在 ES中保存一份原始文档,存放在"source"中,一般情况下不需要设置 store为true,因为在source中已经有一份原始文档了。

映射的类型_keyword关键字

上面我们说明了text类型的属性在映射时都可以is盒子分词器,keyword字段是一个关键字字段,通常搜索keyword是按照整体搜索的,是不会做分词,所以查询的时候是需要精确匹配的,比如邮政编码,身份证号等是不会且不应该做分词的,keywoed文本一般用于过滤,排序,聚合等场合

  • 映射如下:

  • 插入文档

  • 根据name或者身份证号查询

    Get:http://localhost:9200/索引库/类型名称/_search?q=name:狗剩儿

    这样是查询不到的,因为name属性是keyword类型,必须精确匹配

映射的类型_data日期类型

日期类型也是不用设置分词器的一种类型,一般日期类型用于排序

通过format设置日期的格式,上面的这个列子允许date字段储存年月日时分秒||年月日这两种格式

插入文档如下:Post:Post :http://localhost:9200/索引库/类型名/文档id

{ "time":"2018‐08‐15 20:28:58" }

映射的类型_数值类型

  • 尽量选择范围晓得类型,提高检索效率节省空间

  • 对于浮点数,尽量用比列因子,比如一个鸡蛋的单价是1.2元/个,我们将别列因子设置为100,这在ES中会按照分储存,映射如下:

因为我们将比列因子设置为100,所以储存的时候,会将1.2 * 100 进行储存

使用比列因子的好处就在与整型比浮点型更容易压缩,节约空间,当然如果比列因子不合适,我们再选范围小的去存

ES客户端(Java)

  • pom.xml:核心依赖

<dependency><groupId>org.elasticsearch.clientgroupId><artifactId>elasticsearch-rest-high-level-clientartifactId><version>6.2.1version>dependency><dependency><groupId>org.elasticsearchgroupId><artifactId>elasticsearchartifactId><version>6.2.1version>dependency>

  • Spring容器注入客户端

    注意这里注入两个版本的客户端一个是高版本&#xff0c;推荐使用的RestHighLevelClient&#xff0c;但功能可能不是很完善

    RestClient低版本的客户端&#xff0c;当我们高版本的客户端不能使用时&#xff0c;考虑使用这个

&#64;Configuration
public class ElasticsearchConfig {
​&#64;Value(
"${test.elasticsearch.hostlist}")private String hostlist;
//获取高版本的客户端
&#64;Beanpublic RestHighLevelClient restHighLevelClient(){//解析hostlist配置信息String[] split &#61; hostlist.split(",");//创建HttpHost数组&#xff0c;其中存放es主机和端口的配置信息HttpHost[] httpHostArray &#61; new HttpHost[split.length];for(int i&#61;0;i){String item
&#61; split[i];httpHostArray[i] &#61; new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");}//创建RestHighLevelClient客户端return new RestHighLevelClient(RestClient.builder(httpHostArray));}
//项目主要使用RestHighLevelClient&#xff0c;对于低级的客户端暂时不用
&#64;Beanpublic RestClient restClient(){//解析hostlist配置信息String[] split &#61; hostlist.split(",");//创建HttpHost数组&#xff0c;其中存放es主机和端口的配置信息HttpHost[] httpHostArray &#61; new HttpHost[split.length];for(int i&#61;0;i){String item &#61; split[i];httpHostArray[i] &#61; new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");}return RestClient.builder(httpHostArray).build();}
}

创建索引库

首先注入Java客户端&#xff0c;我们使用第一个即可&#xff1a;

//高版本的客户端
&#64;AutowiredRestHighLevelClient highClient;//低版本的客户端
&#64;AutowiredRestClient restClient;//创建索引库
&#64;Testpublic void CreateIndexTest() throws IOException {//创建索引请求对象&#xff0c;并设置索引名称CreateIndexRequest createIndexRequest &#61; new CreateIndexRequest("test_index");//设置索引参数createIndexRequest.settings(Settings.builder().put("number_of_shards",1).put("number_of_replicas",0));//设置映射createIndexRequest.mapping("doc"," {\n" &#43;" \t\"properties\": {\n" &#43;" \"name\": {\n" &#43;" \"type\": \"text\",\n" &#43;" \"analyzer\":\"ik_max_word\",\n" &#43;" \"search_analyzer\":\"ik_smart\"\n" &#43;" },\n" &#43;" \"description\": {\n" &#43;" \"type\": \"text\",\n" &#43;" \"analyzer\":\"ik_max_word\",\n" &#43;" \"search_analyzer\":\"ik_smart\"\n" &#43;" },\n" &#43;" \"studymodel\": {\n" &#43;" \"type\": \"keyword\"\n" &#43;" },\n" &#43;" \"price\": {\n" &#43;" \"type\": \"float\"\n" &#43;" }\n" &#43;" }\n" &#43;"}", XContentType.JSON);//创建索引操作客户端IndicesClient indices &#61; highClient.indices();//创建响应对象CreateIndexResponse createIndexResponse &#61; indices.create(createIndexRequest);//得到响应结果boolean acknowledged &#61; createIndexResponse.isAcknowledged();System.out.println(acknowledged);}

添加文档

查询文档

更新文档

删除文档

搜索 [ 核心用法 ]

环境准备

首先我们创建一个名为“test_index”的索引库

并创建如下索引&#xff1a;

插入以下数据作为测试数据&#xff1a;id分别为1、2、3

最基本的搜索我们前面意思使用过了&#xff1a;

  • 以这样的格式&#xff1a; get ../_search?q&#61;.....

DSL_搜索介绍

  • DSL&#xff1a;"Domain Specific Language "

  • 是ES提出的基于json的搜索方式&#xff0c;在搜索时键入特定的json格式的数据来哇称搜索&#xff0c;全部POST请求

  • 一般项目中都是使用的DSL搜索

DSL_查询所有文档

&#64;Testpublic void queryAllTest() throws IOException {//创建搜索请求对象&#xff0c;绑定索引库和类型SearchRequest searchRequest &#61; new SearchRequest("test_index");searchRequest.types("doc");
//创建:搜索源构建对象SearchSourceBuilder builder &#61; new SearchSourceBuilder();//指定搜索方式:matchAllQuery
builder.query(QueryBuilders.matchAllQuery());//设置源字段过滤&#xff0c;第一个数组表示要包含的字段&#xff0c;第二个数组表示不包括的字段builder.fetchSource(new String[]{"name","studymodel"},new String[]{});//向搜索请求中设置搜索源
searchRequest.source(builder);//使用客户端发起搜索&#xff0c;获得结果SearchResponse searchResponse &#61; highClient.search(searchRequest);//搜索结果SearchHits hits &#61; searchResponse.getHits();//从搜索结果中得到 : 匹配分高位于前面的文档SearchHit[] searchHits &#61; hits.getHits();for (SearchHit hit : searchHits) {Map map &#61; hit.getSourceAsMap();System.out.println(map.get("name"));System.out.println(map.get("studymodel"));}}

使用注意事项&#xff1a;

  • 在我们设置源字段过滤的时候&#xff0c;我们只选取了着两个字段&#xff0c;当我们获取对结果后&#xff0c;也只能获取这两个字段的数据

DSL_分页查询

不分词精确查询Term Query

Term Query为精确查询&#xff0c;在搜索时会整体匹配关键字&#xff0c;不再将关键字分词做搜索

根据Id精确匹配:ids

  • 请求方式&#xff1a;根据id 1和2精确匹配数据

  • Java&#xff0c;注意事项已经在图片中给出

分词全文检索&#xff1a;match Query

match Query&#xff1a;全文检索&#xff0c;先对我们搜索的词条进行分词&#xff0c;然后将分好的词再拿去意义匹配查询

Term Query是不做分词&#xff0c;match Query是要做分词&#xff0c;这里做个对比&#xff0c;利于记忆

在这个请求中&#xff0c;query的值为我们搜索的关键词&#xff0c;会被分词&#xff0c;在这个列子中会被分为“是”、“一”两个字

operator&#xff1a;我们分词后出现了两个词条&#xff0c;只要有一个词条匹配上就命中&#xff0c;与之相应的还有and,表示两个或多个词条必须同时匹配上才能命中&#xff0c;在这里还有扩展&#xff0c;比如我们搜索的关键字分词后为三个字&#xff0c;是一个字匹配上就命中呢&#xff1f;还是两个字匹配上算命中呢&#xff1f;还是全部匹配词条匹配上才能算命中呢&#xff1f;ES提供了占比的方式来检索数据&#xff0c;见下&#xff1a;

minimum_should_match &#xff1a;关键字检索分词时&#xff0c;匹配文档的关键字分词词条百分比指定

"是一个"这个词再被分词时&#xff0c;ik会把它分为四个词&#xff0c;分别为&#xff1a;"是"、"一"、"一个"、"个"&#xff1b;

我们设的80%&#xff0c;表示的意思&#xff0c;一共4个词条&#xff0c;占比8成为 4 * 80% &#61; 3.2 取整为3&#xff0c;表示命中的文档必须有三个词条匹配上

多个字段分词检索&#xff1a;multi Query

上面的Term Query 和match Query一次只能对一个关键词作分词检索&#xff0c;multi Query可以对多个关键词做分词检索

扩展玩法&#xff1a;提升权重boost

 

搜索关键词是"Spring开发",在我们检索该条数据的时候&#xff0c;一般希望的的是名字为"Spring开发",而不是描述中包含这个关键字&#xff0c;所以我们想提高这个关键字在搜索时&#xff0c;对于name字段做特殊照顾&#xff0c;这样就可以将name字段与Spring开发匹配上的文档得分提高&#xff0c;排在命中的前面

布尔查询&#xff1a;bool

布尔查询实现将多个查询组合起来

三个参数

  • must&#xff1a;文档必须匹配must所包含的查询条件

  • should&#xff1a;文档必须匹配should所包含的条件的一个或多个

  • must_not&#xff1a;文档不能匹配must_not包含的任意一个查询条件

    下面这个列子自行替换关键字进行测试

有点绕&#xff0c;我给圈出来了&#xff0c;很好看明白。

过滤器:filter

含义就很重要&#xff0c;需要划线要考&#xff1a;是针对结果进行过滤

过滤器的作用为判断该文档是否匹配&#xff0c;不会去计算匹配得分&#xff0c;性能比查询要高&#xff0c;缓存也方便,推荐的话&#xff1a;

尽量使用过滤器是显示查询或者通过过滤器 &#43; 查询共同检索

过滤器在布尔查询中使用&#xff1a;

  • filter&#xff1a;过滤&#xff0c;term和range一次只能对一个字段进行设置过滤条件

  • term&#xff1a;项匹配过滤&#xff0c;留下studymodel为201004的文档

  • range&#xff1a;范围查询&#xff0c;价格price>60 且 <100的文档

排序&#xff1a;sort

可以对一个字段进行设置排序&#xff0c;支持在keyword&#xff0c;date,float等类型上添加排序&#xff0c;text不允许排序

过滤价格在0—100区间的所有文档&#xff0c;优先按照studymodel降序排序&#xff0c;其次在根据价格升序排序

高亮显示:highlight

高亮显示可以将搜索结果一个或多个字突出显示&#xff0c;以便向用户展示匹配关键字的位置

在搜索语句中添加highlight即可实现&#xff0c;这个我把检索结果也贴出来方便查看

---------------------------------------------------------------------

最后因为我们只获取了高亮里面的name&#xff1a;ElasticSearch开发学习

因为可读性&#xff0c;Json我都是截图的的方式展示的&#xff0c;索性代码也是截图了&#xff0c;后续可能还有补充......

献上Es相关的资源&#xff1a;https://pan.baidu.com/s/10LZyR2jX2WAnEsLibHLAfA   提取码&#xff1a;yc90 

 

 

转:https://www.cnblogs.com/msi-chen/p/11403279.html



推荐阅读
  • java日志框架详解
    Java日志框架详解1.常用日志框架1.1Java常用日志框架类别1.2Java常用日志框架历史1.3两大日志接口阵营1.3.1基于CommonsLogging接口实现的常用日志框 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • Elasticsearch1Elasticsearch入门1.1Elasticsearch术语1.1.16.0以前的Elasticsearch术语1.1.26.0以后的Elasti ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
  • ElasticSerach初探第一篇认识ES+环境搭建+简单MySQL数据同步+SpringBoot整合ES
    一、认识ElasticSearch是一个基于Lucene的开源搜索引擎,通过简单的RESTfulAPI来隐藏Lucene的复杂性。全文搜索,分析系统&# ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 学习mybatis的基础知识:mybatis入门教程(二)
    2019独角兽企业重金招聘Python工程师标准2.3MyBatisprintsql在log4j.properties配置文件中添加如下配置,让mybatis打 ... [详细]
  • springboot日志【转】【补】
     市面上的日志框架日志门面(日志的抽象层)日志实现JCL(JakartaCommonsLogging)(2014)SLF4j(SimpleLoggingFacadeforJava) ... [详细]
  • elasticsearch插件如何实现类
    这篇文章主要介绍“elasticsearch插件如何实现类”,在日常操作中,相信很多人在elasticsearch插件如何实现类问题上存在疑惑,小编查阅了各式资料 ... [详细]
  • 社交_java app鸿鹄社交娱乐直播平台
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了javaapp鸿鹄社交娱乐直播平台相关的知识,希望对你有一定的参考价值。 ... [详细]
  • log4j相关
    Log4j的类图Logger-日志写出器,供程序员输出日志信息Appender-日志目的地,把格式化好的日志信息输出到指定的地方去ConsoleAppe ... [详细]
  • ES基本原理名词解释In-memorybuffer:ES内存缓冲区,新建的document写入的地方document:索引和搜索的 ... [详细]
  • 开发笔记:MyBatis03:ResultMap及分页
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了MyBatis03:ResultMap及分页相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
前所未闻啊_549
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有