ElasticSearch(四)查询、分词器

向索引

  正排表是以文档的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是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇):

GET mymayikt/user/_search
{
  "query": {
    "term": {
      "name": "xiaoming"
    }
  }
}

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

GET /mymayikt/user/_search
{
  "from": 0,
  "size": 2,
  "query": {
    "match": {

        "car": "奥迪"
      }
  }
}

  使用filter过滤年龄

GET /mymayikt/user/_search
{
    "query": {
        "bool": {
            "must": [{
                "match_all": {}
            }],
            "filter": {
                "range": {
                    "age": {
                        "gt": 21,
                        "lte": 51
                    }
                }
            }
        }
    },
    "from": 0,
    "size": 10,
    "_source": ["name", "age"]
}

分词器:

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

  一、传统分词器演示:

http://192.168.212.181:9200/_analyze

//请求:
{
  "analyzer": "standard",
  "text": "奥迪a4l"
}

//查询结果
{
    "tokens": [
        {
            "token": "奥",
            "start_offset": 0,
            "end_offset": 1,
            "type": "<IDEOGRAPHIC>",
            "position": 0
        },
        {
            "token": "迪",
            "start_offset": 1,
            "end_offset": 2,
            "type": "<IDEOGRAPHIC>",
            "position": 1
        },
        {
            "token": "a4l",
            "start_offset": 2,
            "end_offset": 5,
            "type": "<ALPHANUM>",
            "position": 2
        }
    ]
}

  二、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即可

http://192.168.212.181:9200/_analyze
//请求
{
  "analyzer": "ik_smart",
  "text": "奥迪"
}

//查询结果
{
    "tokens": [
        {
            "token": "奥迪",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "a4l",
            "start_offset": 2,
            "end_offset": 5,
            "type": "LETTER",
            "position": 1
        }
    ]
}

  三、自定义扩展字典

    (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

<?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">custom/new_word.dic</entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords"></entry>
    <!--用户可以在这里配置远程扩展字典 -->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--用户可以在这里配置远程扩展停止词字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

原文地址:https://www.cnblogs.com/soft2018/p/10203330.html

时间: 2024-11-09 19:47:30

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

Elasticsearch之中文分词器插件es-ik

前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch之停用词 Elasticsearch之中文分词器 Elasticsearch之几个重要的分词器 elasticsearch官方默认的分词插件 1.elasticsearch官方默认的分词插件,对中文分词效果不理想. 比如,我现在,拿个具体实例来展现下,验证为什么,es官网提供的分词插件对中文分词而言,效果差. [[email protected] elasti

Elasticsearch之中文分词器插件es-ik的热更新词库

前提 Elasticsearch之中文分词器插件es-ik的自定义词库 先声明,热更新词库,需要用到,web项目和Tomcat.不会的,请移步 Eclipse下Maven新建项目.自动打依赖jar包(包含普通项目和Web项目) Tomcat *的安装和运行(绿色版和安装版都适用) Tomcat的配置文件详解 1: 部署 http 服务在这使用 tomcat7 作为 web 容器, 先下载一个 tomcat7, 然后上传到某一台服务器上(192.168.80.10).再执行以下命令 tar -zx

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

介绍:ElasticSearch 是一个基于 Lucene 的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口.Elasticsearch 是用 Java 开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便. Elasticsearch中,内置了很多分词器(analyzers).下面来进行比较下系统默认分词器和常用的中文分词器之间的区别. 系统默认分词器:1.

ElasticSearch的中文分词器ik

一.前言   为什么要在elasticsearch中要使用ik这样的中文分词呢,那是因为es提供的分词是英文分词,对于中文的分词就做的非常不好了,因此我们需要一个中文分词器来用于搜索和使用. 二.IK分词器的安装和使用 2.1.安装ik    我们可以从官方github上下载该插件,我们下载对应于我们使用的es的版本的ik,并且我们能够看到具体的安装步骤,可以有两种安装方法.      这里我们选择第一种方式:    重启es,我们就可以使用ik这个中文分词器了. 2.2.使用ik中文分词器  

elasticsearch 安装中文分词器

发车 为什么要在elasticsearch中要使用ik这样的中文分词呢,那是因为es提供的分词是英文分词,对于中文的分词就做的非常不好了,因此我们需要一个中文分词器来用于搜索和使用.今天我们就尝试安装下IK分词. 上车 1.去github 下载对应的分词插件https://github.com/medcl/elasticsearch-analysis-ik/releases根据不同版本下载不同的分词插件 2.到es的plugins 目录创建文件夹cd your-es-root/plugins/

ElasticSearch、IK分词器、Head Master安装-----Windows

ElasticSearch安装运行前提条件:配置好Jdk Head-Master运行前提条件:node 一.下载 地址:https://www.elastic.co/cn/downloads/elasticsearch 历史版本:找到下面这句话 然后双击 Not the version you're looking for? View past releases. 二.IK分词器下载 地址:https://github.com/medcl/elasticsearch-analysis-ik/re

ElasticSearch 用ik分词器建立索引(java API)

ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,作为当前流行的企业级搜索引擎,用于云计算中,能够达到实时搜索,并且具有稳定,可靠,快速安装,使用方便等多种优点,得到大多数企业的青睐. ElasicSearch可以通过终端建立索引,但是本人在做项目的时候用终端建立的索引,然后使用Java API进行数据的插入,始终得不到分词,最终的解决办法就是通过Java API

Elasticsearch中的分词器比较及使用方法

Elasticsearch 默认分词器和中分分词器之间的比较及使用方法 https://segmentfault.com/a/1190000012553894 介绍:ElasticSearch 是一个基于 Lucene 的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口.Elasticsearch 是用 Java 开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用

elasticsearch安装ik分词器(极速版)

简介:下面讲有我已经打包并且编辑过的zip包,你可以在下面下载即可. 1.下载zip包.elasticsearch-analysis-ik-1.8.0.jar下面有附件链接[ik-安装包.zip],下载即可.(内有做好的elasticsearch-analysis-ik-1.8.0.jar) 2.上传zip包.下载ik.zip文件后解压缩,如下图. 修改plugin-descriptor.properties文件,将elasticsearch.version=2.2.0改成自己的elastics

Elasticsearch:Pinyin 分词器

Elastic的Medcl提供了一种搜索Pinyin搜索的方法.拼音搜索在很多的应用场景中都有被用到.比如在百度搜索中,我们使用拼音就可以出现汉字: 对于我们中国人来说,拼音搜索也是非常直接的.那么在Elasticsearch中我们该如何使用pinyin来进行搜索呢?答案是我们采用Medcl所创建的elasticsearch-analysis-pinyin分析器.下面我们简单介绍一下如何进行安装和测试. 下载Pinyin分析器源码进行编译及安装 由于elasticsearch-analysis-