向索引

  正排表是以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档。

  这种组织方法在建立索引的时候结构比较简单,建立比较方便且易于维护;因为索引是基于文档建立的,若是有新的文档加入,直接为该文档建立一个新的索引块,挂接在原来索引文件的后面。若是有文档删除,则直接找到该文档号文档对应的索引信息,将其直接删除。但是在查询的时候需对所有的文档进行扫描以确保没有遗漏,这样就使得检索时间大大延长,检索效率低下。

  尽管正排表的工作原理非常的简单,但是由于其检索效率太低,除非在特定情况下,否则实用性价值不大。

倒排索

  倒排表以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置情况。

  由于每个字或词对应的文档数量在动态变化,所以倒排表的建立和维护都较为复杂,但是在查询的时候由于可以一次得到查询关键字所对应的所有文档,所以效率高于正排表。在全文检索中,检索的快速响应是一个最为关键的性能,而索引建立由于在后台进行,尽管效率相对低一些,但不会影响整个搜索引擎的效率。

  正排索引是从文档到关键字的映射(已知文档求关键字),倒排索引是从关键字到文档的映射(已知关键字求文档)。

文档内容:

序号

文档内容

1

小俊是一家科技公司创始人,开的汽车是奥迪a8l,加速爽。

2

小薇是一家科技公司的前台,开的汽车是保时捷911

3

小红买了小薇的保时捷911,加速爽。

4

小明是一家科技公司开发主管,开的汽车是奥迪a6l,加速爽。

5

小军是一家科技公司开发,开的汽车是比亚迪速锐,加速有点慢

 

  倒排索引会对以上文档内容进行关键词分词,可以使用关键次直接定位到文档内容。

 

单词ID

单词

倒排列表docId

1

1,2,3,4,5

2

一家

1,2,4,5

3

科技公司

1,2,4,5

4

开发

4,5

5

汽车

1,2,4,5

6

奥迪

1,4

7

加速爽

1,3,4

8

保时捷

2,3

9

保时捷911

2

10

比亚迪

5

高级查询:

  根据id进行查询

GET /mymayikt/user/12

  查询当前所有类型的文档 

GET /mymayikt/user/_search

  根据多个ID批量查询 

  查询多个id分别为1、2

GET /mymayikt/user/_mget

{

"ids":["1","2"]

}

复杂条件查询 

  查询年龄为年龄21岁

GET /mymayikt/user/_search?q=age:21

  查询年龄30岁-60岁之间

GET /mymayikt/user/_search?q=age[30 TO 60]

注意:TO 一定要大

  查询年龄30岁-60岁之间 并且年龄降序、从0条数据到第1条数据

GET /mymayikt/user/_search?q=age[30 TO 60]&sort=age:desc&from=0&size=1

  查询年龄30岁-60岁之间 并且年龄降序、从0条数据到第1条数据,展示name和age字段

GET /mymayikt/user/_search?q=age[30 TO 60]&sort=age:desc&from=0&size=1&_source=name,age

Dsl语言查询与过滤

  什么是DSL语言

  es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL)。
由于DSL查询更为直观也更为简易,所以大都使用这种方式。
  DSL查询是POST过去一个json,由于post的请求是json格式的,所以存在很多灵活性,也有很多形式。

  Term与Match区别:

  Term查询不会对字段进行分词查询,会采用精确匹配。

  Match会根据该字段的分词器,进行分词查询。

  根据名称精确查询姓名(term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇):

  1. GET mymayikt/user/_search
  2. {
  3. "query": {
  4. "term": {
  5. "name": "xiaoming"
  6. }
  7. }
  8. }

  根据汽车名称模糊查询(match查询相当于模糊匹配,只包含其中一部分关键词就行

  1. GET /mymayikt/user/_search
  2. {
  3. "from": 0,
  4. "size": 2,
  5. "query": {
  6. "match": {
  7.  
  8. "car": "奥迪"
  9. }
  10. }
  11. }

  使用filter过滤年龄

  1. GET /mymayikt/user/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [{
  6. "match_all": {}
  7. }],
  8. "filter": {
  9. "range": {
  10. "age": {
  11. "gt": 21,
  12. "lte": 51
  13. }
  14. }
  15. }
  16. }
  17. },
  18. "from": 0,
  19. "size": 10,
  20. "_source": ["name", "age"]
  21. }

分词器:

  因为Elasticsearch中默认的标准分词器分词器对中文分词不是很友好,会将中文词语拆分成一个一个中文的汉子。因此引入中文分词器-es-ik插件。

  一、传统分词器演示:

http://192.168.212.181:9200/_analyze

  1. //请求:
  2. {
  3. "analyzer": "standard",
  4. "text": "奥迪a4l"
  5. }
  6.  
  7. //查询结果
  8. {
  9. "tokens": [
  10. {
  11. "token": "奥",
  12. "start_offset": 0,
  13. "end_offset": 1,
  14. "type": "<IDEOGRAPHIC>",
  15. "position": 0
  16. },
  17. {
  18. "token": "迪",
  19. "start_offset": 1,
  20. "end_offset": 2,
  21. "type": "<IDEOGRAPHIC>",
  22. "position": 1
  23. },
  24. {
  25. "token": "a4l",
  26. "start_offset": 2,
  27. "end_offset": 5,
  28. "type": "<ALPHANUM>",
  29. "position": 2
  30. }
  31. ]
  32. }

  二、IK分词插件

  下载地址: https://github.com/medcl/elasticsearch-analysis-ik/releases

    注意: es-ik分词插件版本一定要和es安装的版本对应

  第一步:下载es的IK插件,名改为ik.zip(上传时候是上传ik为名的文件夹)

  第二步: 上传到/usr/local/elasticsearch-6.4.3/plugins

  第三步: 重启elasticsearch即可

  1. http://192.168.212.181:9200/_analyze
  2. //请求
  3. {
  4. "analyzer": "ik_smart",
  5. "text": "奥迪"
  6. }
  7.  
  8. //查询结果
  9. {
  10. "tokens": [
  11. {
  12. "token": "奥迪",
  13. "start_offset": 0,
  14. "end_offset": 2,
  15. "type": "CN_WORD",
  16. "position": 0
  17. },
  18. {
  19. "token": "a4l",
  20. "start_offset": 2,
  21. "end_offset": 5,
  22. "type": "LETTER",
  23. "position": 1
  24. }
  25. ]
  26. }

  三、自定义扩展字典

    (1)、在/usr/local/elasticsearch-6.4.3/plugins/ik/config目录下

    (2)、vi custom/new_word.dic(先在config目录中建custom文件夹,把要修改的文件放到该文件夹中,后再IKAnalyzer.cfg.xml中进行设置)

      老铁

      王者荣耀

      洪荒之力

      共有产权房

      一带一路

      余胜军

    (3)、vi IKAnalyzer.cfg.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
  3. <properties>
  4. <comment>IK Analyzer 扩展配置</comment>
  5. <!--用户可以在这里配置自己的扩展字典 -->
  6. <entry key="ext_dict">custom/new_word.dic</entry>
  7. <!--用户可以在这里配置自己的扩展停止词字典-->
  8. <entry key="ext_stopwords"></entry>
  9. <!--用户可以在这里配置远程扩展字典 -->
  10. <!-- <entry key="remote_ext_dict">words_location</entry> -->
  11. <!--用户可以在这里配置远程扩展停止词字典-->
  12. <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
  13. </properties>

ElasticSearch(四)查询、分词器的更多相关文章

  1. 【自定义IK词典】Elasticsearch之中文分词器插件es-ik的自定义词库

    Elasticsearch之中文分词器插件es-ik 针对一些特殊的词语在分词的时候也需要能够识别 有人会问,那么,例如: 如果我想根据自己的本家姓氏来查询,如zhouls,姓氏“周”.      如 ...

  2. 沉淀再出发:ElasticSearch的中文分词器ik

    沉淀再出发:ElasticSearch的中文分词器ik 一.前言   为什么要在elasticsearch中要使用ik这样的中文分词呢,那是因为es提供的分词是英文分词,对于中文的分词就做的非常不好了 ...

  3. Elasticsearch之中文分词器插件es-ik(博主推荐)

    前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch之停用词 Elasticsearch之中文分词器 Elasti ...

  4. Elasticsearch之中文分词器插件es-ik的自定义热更新词库

    不多说,直接上干货! 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟       ...

  5. 如何给Elasticsearch安装中文分词器IK

    安装Elasticsearch安装中文分词器IK的步骤: 1. 停止elasticsearch 2.2的服务 2. 在以下地址下载对应的elasticsearch-analysis-ik插件安装包(版 ...

  6. Elasticsearch之中文分词器

    前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch之停用词 Elasticsearch的中文分词器 1.单字分词 ...

  7. elasticsearch安装中文分词器插件smartcn

    原文:http://blog.java1234.com/blog/articles/373.html elasticsearch安装中文分词器插件smartcn elasticsearch默认分词器比 ...

  8. windows下elasticsearch安装ik分词器后无法启动

    windows下elasticsearch安装ik分词器后启动报如下图错误: 然后百度说是elasticsearch路径有空格,一看果然我的路径有空格,然后重新换个路径就好了.

  9. ElasticSearch安装中文分词器IKAnalyzer

    # ElasticSearch安装中文分词器IKAnalyzer  本篇主要讲解如何在ElasticSearch中安装中文分词器IKAnalyzer,拆分的每个词都是我们熟知的词语,从而建立词汇与文档 ...

  10. ElasticSearch最全分词器比较及使用方法

    介绍:ElasticSearch 是一个基于 Lucene 的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口.Elasticsearch 是用 Java 开 ...

随机推荐

  1. MongoDB快速入门教程 (4.3)

    4.3.Mongoose模块化 4.3.1.为什么要进行模块化拆分? 模块化拆分的目的是为了代码的复用,让整个项目的结构更加清晰,举个例子:当数据库中的集合变多的时候,例如有课程.订单.分类.教师等多 ...

  2. C++ 简单的UDP客户端与服务端

    .h #pragma once #ifndef __C_UDP_OBJECT_H__ #define __C_UDP_OBJECT_H__ #define OS_PLATFORM_WIN #inclu ...

  3. 飞越面试官(三)--JVM

    大家好!我是本公众号唯一官方指定没头屑的小便--怕屁林.   JVM,全称Java Virtual Machine,作为执行Java程序的容器,几乎代理了Java内存与服务器内存的交互,可以说是程序拥 ...

  4. java语言进阶(四)_Map_斗地主案例

    第一章 Map集合 1.1 概述 现实生活中常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种 ...

  5. linux磁盘容量不足的处理方案

    在虚机上安装memcached时,突然发现磁盘空间不足. df -h 发现,磁盘一共12G,原来是新申请的虚机,磁盘分区没有挂载上. fdisk -l 查看磁盘,发现有 /dev/vdb1 /dev/ ...

  6. css3动画的性能优化_针对移动端卡顿问题

    这篇文章主要讲的是怎样制作流畅动画,特别是针对移动端.在这里我首先介绍制作动画的几种方法的优缺点:接着会着重介绍用css3制作动画的注意事项. 资源网站大全 https://55wd.com 设计导航 ...

  7. 区间dp(能量项链)

    [题目大意] 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记 ...

  8. 6.22 集训--DP复习一

    总结 下午的突击练习完全不在状态 A.拦截导弹简单版 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发 ...

  9. Python 最强 IDE 详细使用指南!

    PyCharm 是一种 Python IDE,可以帮助程序员节约时间,提高生产效率.那么具体如何使用呢?本文从 PyCharm 安装到插件.外部工具.专业版功能等进行了一一介绍,希望能够帮助到大家.作 ...

  10. Howdoo 纳入华为生态系统

    原文链接:https://howdoo.io/howdoo-and-huawei-appgallery/ 重点摘要: 我们是华为设备的忠实粉丝,因此我们非常高兴地宣布,我们一直在积极讨论如何开发 Ho ...