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

Elasticsearch6.x版本全文检索学习之倒排索引与分词、Mapping设置

 

Beats,Logstash负责数据收集与处理。相当于ETL(Extract Transform Load)。
Elasticsearch负责数据存储、查询、分析。
Kibana负责数据探索与可视化分析。

1、Elasticsearch的常见术语。注意:Elasticsearch6.x版本以后概念发生了变化。

2、索引Index:由具有相同字段的文档列表组成。索引Index是文档的集合。相当于数据库中的数据表。

  Elasticsearch 6.x版本以后,一个索引Index下面最多只能建一个Type或者未来没有Type了。索引中存储具有相同结构的文档(Document)。相当于数据表,数据表中有schema的概念,数据表有自己的表结构的定义。而Index的mapping相当于数据表的schema的概念,Index也需要定义字段名称和类型的。

  每个索引都有自己的mapping定义,用于定义字段名和类型。一个集群可以有多个索引。

3、文档Document:用户存储在es中的数据文档。es中存储的最小单元。相当于数据库中的一行数据。每个文档都有唯一的id标识,可以自行指定或者es自动生成。

Json Object,由字段Field组成,常见数据类型如下:
    字符串:text(分词)、keyword(不分词)。
    数值型:long、integer、short、byte、double、float、half_float、scaled_float。
    布尔型:boolean。
    日期:data。
    二进制:binary。
    范围类型:interger_range、float_range、long_range、double_range、date_range。

4、Document MetaData。元数据,用于标注文档的相关信息。

_index:文档所在的索引名称。
_type:文档所在的类型名称。
_id:文档唯一的id。
_uid:组合id,由_type和_id组成(6.x_type不再起作用,同_id一样)。
_source:文档的原始Json数据,可以从这里获取每个字段的内容。
_all:整合所有字段内容到该字段,默认禁用。

5、节点Node:一个Elasticsearch的运行实例,是集群的构成单元。

6、集群Cluster:由一个或者多个节点组成,对外提供服务。

7、Elasticsseach提供的Rest api。

Elasticsseach集群对外提供的RESTFul API,REST是REpresentational State Transfer的缩写。
URI指定资源,如Index、Document等等。
Http Method,指明资源操作类型,如GET、POST、PUT、DELETE等等。
Rest API常用的两种交互方式:Curl命令行、Kibana DecTools。
ElasticSearch有专门的Index API,用于创建(PUT)、查看(GET)、更新(Post)、删除(Delete)索引配置等等。

 

8、Elasticsseach提供的Rest api使用。

  创建文档,指定id创建文档的api。创建文档的时候,如果索引不存在,es会自动创建对应的index和type。

PUT /index/type/id{
   "username":"zhangsan",
   "age":24
}

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

查询文档,指定要查询的文档id。_source存储了文档的完整原始数据。

get /index/type/id

查询文档,搜索所有文档,用到_search,查询语句json格式,放到http body中发送到es,如下所示:

get /index/type/_search
    
返回_id为1的文档。

get /index/type/_search{
    "query":{
      "term":{
          "_id":"1"
      }
    }
}

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

response结果,参数解释如下所示:

 1 response结果,参数解释如下所示:
 2 {
 3   "took" : 2,           # took是查询耗时,单位是ms。         
 4   "timed_out" : false,
 5   "_shards" : {
 6     "total" : 5,
 7     "successful" : 5,
 8     "skipped" : 0,
 9     "failed" : 0
10   },
11   "hits" : { # hits是命中的结果集。
12     "total" : 1, # total是符合条件的总文档数。
13     "max_score" : 0.2876821,
14     "hits" : [  # hits是返回的文档详情数据数组,默认前10个文档。
15       {
16         "_index" : "test_index", # _index是索引名称。
17         "_type" : "doc",
18         "_id" : "1", # _id是文档的id。
19         "_score" : 0.2876821, # _score是文档的得分。
20         "_source" : { # _source是文档的详情。
21           "username" : "wangwu",
22           "age" : 24
23         }
24       }
25     ]
26   }
27 }

批量创建文档API,es允许一次创建多个文档,从而减少网络传输开销,提升写入速率。endponit为_bulk,即url最后是_bulk,http method是post请求,如下所示:

action_type包含,index(如果存在则覆盖)、update、create(如果存在则报错)、delete这几种类型。

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

es允许一次查询多个文档,endpoint为_mget,如下所示:

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

9、Elasticsearch的倒排索引与分词。举例,书的目录页与索引页,目录页对应正排索引,索引页对应倒排索引。es存储的是一个json格式的文档,其中包含多个字段,每个字段会有自己的倒排索引。

  a、正排索引就是文档Id到文档内容,单词的关联关系。倒排索引,就是单词到文档Id的关联关系。

  b、倒排索引是搜索引擎的核心,主要包含两个部分。单词词典(Term Dictionary),倒排列表(Posting List),Posting是倒排索引项。

  c、单词词典(Term Dictionary)是倒排索引的重要组成。

一是记录所有文档的单词,一般都比较大,
二是记录单词到倒排列表的关联信息,记录了单词关联了那些文档,记录一下关联信息,就可以找到关联的文档的id,通过关联id找到真正的文档信息。

  d、倒排索引中的倒排列表。

倒排列表(Posting List)记录了单词对应的文档集合,由倒排索引项(Psoting)组成。
倒排索引项(Posting)主要包含如下信息:
    文档Id,用于获取原始信息。
    单词频率(TF,Term Frequency),记录该单词在该文档中的出现次数,用于后续相关性算分。
    位置(Position),记录单词在文档中的分词位置(多个),用于做此语搜索(Phrase Query)。
    偏移(Offset),记录单词在文档的开始和结束位置,用于做高亮显示。

10、分词,是指将文本转换成一系列单词(term or token)的过程,也可以叫做文本分词,在es里面称为Analysis,如下所示:

  分词器,负责进行分词,分词器是es中专门处理分词的组件,英文名称为Analyzer。分词器的调用顺序,Character Filters ->Tokenizer ->Token Filter,它的组成如下所示:

  Character Filters,针对原始文本进行处理,比如去除html特殊标记符。
  Tokenizer,将原始文本按照一定规则切分为单词。
  Token Filter,针对Tokenizer处理的单词就行再加工,比如转小写,删除或者新增等等处理。

11、Analyzer api,es提供了一个测试分词的api接口,方便验证分词效果,endpoint是_analyze。

  a、可以直接指定analyzer进行测试。

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

  b、可以直接指定索引中的字段进行测试。

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

  c、可以自定义分词器进行测试。

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

12、Elasticsearch自带分词器,包含Standard、Simple、Whitespace、Stop、Keyword、Pattern、Language,如下所示:

a、Standard Analyzer,默认分词器,特性为:a、按照切分,支持多语言,b、小写处理。
    包含Tokenizer(Standard)和Token Filters(Standard -> Lower case -> Stop[disabled by default])。
b、Simple Analyzer,特性为:a、按照非字母进行切分,b、小写处理。
    包含Tokenizer(Lower Case)。
c、Whitespace Analyzer,特性为:a、按照空格进行切分。
    包含Tokenizer(Whitespace)。
d、Stop Analyzer,Stop word指语气助词等修饰性的此语,比如the、an、的、这等等。特性为,a、相比Simple Analyzer多了Stop word处理。
    包含Tokenizer(Lower Case),Token Filters(Stop)。
e、Keyword Analyzer,特性为,a、不分词,直接将输入作为一个单词输出。
    包含Tokenizer(Keyword)。
f、    Pattern Analyzer,特性为,a、通过正则表达式自定义分隔符。b、默认是\W+,即非字词的符号作为分隔符。
    包含Tokenizer(Pattern),Token Filters(Lower case -> Stop[disabled by default])。
g、Language Analyzer,提供了30+常见语言的分词器。
    arabic、armenian、basque、bengali、brazilian、bulgarian、catalan、cjk、czech、danish、dutch、english。

13、中文分词,指的是将一个汉字序列切分成一个一个单独的词。在英文中,单词之间是以空格作为自然分界符,汉语中词没有一个形式上的分界符。

常用中文分词系统。
  IK中文分词器。
      a、实现中英文单词的切分,支持ik_smart,ik_maxword等模式。
      b、可以自定义词库,支持热更新分词词典。
  jieba中文分词器。
    a、python中最流行的分词系统,支持分词和词性标注。
    b、支持繁体分词,自定义分词,并行分词等等。

14、自定义分词,当自带的分词无法满足需求时候,可以自定义分词。通过自定义Character Filters、Tokenizer和Token Filter实现。

1)、Character Filters。
    a、在Tokenizer之前对原始文本进行处理,比如增加、删除或者替换字符等等。
    b、自带的如下所示:
        Html Strip去除html标签和转换html实体。
        Mapping进行字符替换操作。
        Pattern Replace进行正则匹配替换。
    c、会影响后续Tokenizer解析的postion和offset的信息。
2)、Tokenizer。
    a、将原始文本按照一定规则切分为单词(term or token)。
    b、自带的如下所示:
        standard按照单词进行分割。
        letter按照非字符类进行分割。
        whitespace按照空格进行分割。
        UAX URL Email按照standard分割,但不会分割邮箱和url。
        NGram和Edge NGram连词分割。
        Path Hierarchy按照文件路径进行切割。
3)、Token Filter。
    a、对于Tokenizer输出的单词(term)进行增加、删除、修改等等操作。
    b、自带的如下所示:    
        lowercase将所有term转换为小写。
        stop删除stop words。
        NGram和Edge NGram连词分割。
        Synonym添加近义词的term。

15、分词使用说明,索引时分词和查询时候分词的选择。

分词使用说明,索引时分词和查询时候分词的选择。
1)、分词会在如下两个时机使用:
    a、创建或者更新文档的时候(Index Time),会对相应的文档进行分词处理。
    b、查询的时候(Search Time),会对查询语句进行分词。
2)、索引时分词,是通过配置Index Mapping中每个字段的analyzer属性实现的,不指定分词的时候,默认使用standard分词器。    
3)、查询时分词的指定方式有如下几种。
    a、查询的时候通过analyzer指定分词器。
    b、通过index mapping设置search_analyzer实现,这个时候可以设置查询时分词,同事设置查询时分词。
4)、一般情况下,不需要特定指定查询时分词器,直接使用索引时分词器即可,否则会出现无法匹配的情况。
5)、分词的使用建议。
    a、明确字段是否需要分词,不需要分词的字段就将type设置为keyword,可以节省空间和提高写性能。
    b、善用_analyze_api,查看文档具体分词结果。
    c、多动手测试,查看文档具体的分词结果。

16、Elasticsearch Mapping设置。类似数据库中的表结构定义,主要作用如下所示:

a、定义Index下的字段名(Field Name)。
b、定义字段的类型,比如数据型,字符串型,布尔型等等。
c、定义倒排索引相关的配置,比如是否索引,记录position等等。

如何获取到一个索引Index的mapping呢,如下所示:

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

如何自定义mapping呢,自定义mapping的api,如下所示:

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

自定义Mapping注意事项。

1)、Mapping中的字段类型一旦设定以后,禁止直接修改,原因如是所示,Lucene实现的倒排索引生成后不允许进行修改。
    如果要进行修改字段类型的话,重新建立新的索引,然后做reindex操作。
2)、允许新增字段,通过dynamic参数来控制字段的新增。因为新增字段,类型不定,对于es来说,只是新增了一个倒排索引。dynamic参数是和properties一个级别的参数配置。
    a、true(默认),允许自动新增字段。
    b、false,不允许自动新增字段,但是文档可以正常写入,但无法对字段进行查询等操作。
    c、strict文档不能写入,报错。
3)、copy_to参数,将该字段的值复制到目标字段,实现类似_all的作用,不会出现在_source中,只用来搜索使用。copy_to参数和type一个级别的参数。
4)、index参数,控制当前字段是否索引,默认为true,即记录索引,false不记录,即不可以搜索。index参数和type一个级别的参数。如果不希望被查询即可设置为false。
5)、index_options用于控制倒排索引记录的内容,有如下4种配置。index_options参数和type一个级别的参数。
  a、docs只记录doc id。
  b、freqs记录doc id和term frequencies。
  c、positions记录doc id、term frequencies和term position。
  d、offsets记录doc id、term frequencies、term position和character offsets。
  e、text类型默认配置为positions,其他默认配置为docs。记录内容越多,占用空间越大。
6)、null_value,当字段遇到null值得时候得处理策略,默认为null,即空值,此时es会忽略该值,可以通过设定该值设定字段的默认值。null_value参数和type一个级别的参数。
更多参数详见官网文档即可。

17、Elasticsearch的数据类型。

1)、核心的数据类型(字段field对应的类型type)。
    a、字符串类型text(分词的)、keyword(不分词的)。
    b、数值型:long、integer、short、byte、double、float、half_float、scaled_float。
    c、布尔型:boolean。
    d、日期:data。
    e、二进制:binary。
    f、范围类型:interger_range、float_range、long_range、double_range、date_range。
2)、复杂数据类型。
    a、数组类型array。
    b、对象类型object。
    c、嵌套类型nested object。
3)、地理位置数据类型。
    a、geo_point。
    b、geo_shape。
4)、专用类型。
    a、记录ip地址ip。
    b、实现自动补全completion。
    c、记录分词数token_count。
    d、记录字符串hash值murmur3。
    e、percolator。
    f、join。
5)、多字段特性multi_fields。
    允许对同一个字段采用不同得配置,比如分词,常见例子如对人名实现拼音搜索。只需要在人名种新增一个子字段为pinyin即可。

18、Dynamic Mapping,es可以自动识别文档字段类型,从而降低用户使用成本,如下所示。

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

es是依靠json文档的字段类型来实现自动识别字段类型,支持的类型如下所示:

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

19、dynamic日期与数字识别。

1)、日期的自动识别可以自行配置日期格式,以满足各种需求。
    a、默认是["strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z || yyyy/MM/dd Z"]
    b、strict_date_optional_time是ISO datetime的格式,完整格式类似下面所示:
        YYYY-MM-DDThh:mm:ssTZD。例如,1994-07-12T19:20:30+01:00
    c、dynamic_date_formats可以自定义日期类型。该参数是在type参数下一级的参数。
    d、date_detection可以关闭日期自动识别的机制。该参数是在type参数下一级的参数。
2)、字符串是数字的时候,默认不会自动识别为整数,因为字符串中出现数字是完全合理的。
    a、numeric_detection可以开启字符串中数字的自动识别。该参数是在type参数下一级的参数。

20、dynamic-template(动态模板)简介。

1)、允许根据es自动识别的数据类型、字段名等来动态设定字段类型,可以实现如下效果。
    a、所有字符串类型都设定为keyword类型,即默认不分词的。
    b、所有以message开头的字段都设定为text类型,即分词。
    c、所有以long_开头的字段都设定为long类型。
    d、所有自动匹配为double类型都设定为float类型,以节省空间。
2)、匹配规则一般有如下几个参数。
    a、match_mapping_type匹配es自动识别的字段类型,如boolean、long、string等等。
    b、match,unmatch匹配字段名。
    c、path_match,path_unmatch匹配路径。
3)、字符串默认使用keyword类型。es默认会为字符串设置为text类型,并增加一个keyword的子字段。

字符串默认使用keyword类型。es默认会为字符串设置为text类型,并增加一个keyword的子字段。

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

动态模板映射以后是这样的。

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

以message开头的字段都设置为text类型。 dynamic_templates,数组,可以指定多个匹配规则。可以设定多个模板,执行顺序,从上到下的。

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

21、自定义mapping的建议。

自定义mapping的操作步骤如下所示。
    a、写一条文档到es的临时索引中,获取es自动生成的mapping。
    b、修改步骤a得到的mapping,自定义相关配置。
    c、使用步骤b的mapping创建实际所需索引。

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

最方便的是根据动态模板进行创建。

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

22、索引模板。

  a、索引模板,英文为Index Template,主要用于在新建索引的时候自动应用预先设定的配置。简化索引创建的操作步骤。
    可以设定索引的配置和mapping。
    可以有多个模板,根据order设置,order大的覆盖小的配置。

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

 

Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

作者:别先生

博客园:https://www.cnblogs.com/biehongli/

如果您想及时得到个人撰写文章以及著作的消息推送,可以扫描上方二维码,关注个人公众号哦。


推荐阅读
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
author-avatar
雪国文话天下
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有