elasticSearch精确索引和全文索引

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elasticSearch精确索引和全文索引相关的知识,希望对你有一定的参考价值。

参考技术A 精确索引顾名思义就是完全匹配的索引,包括大小写的区分,Foo 和 foo就不是相同的索引,使用sql语言可以很好的表示,精确匹配。
全文索引就比较微妙,我们在搜索Foo的时候,我们也希望可以搜索出foo,甚至fo。
elastic search为了达到全文搜索中希望达到的目的,在文档存储的时候会进行分析,建立倒排索引。
建立倒排索引的过程就是分析和标准话的过程。
分析和分析器
1、首先将文本分成适合索引的独立的词条。
2、将这些分出来的词条进行标准化,以提高索引程度。
1、字符过滤器:该过滤器是进行分词前的整理,比如将文本中的html字符去掉,将 ‘&’ 转换为 ‘and’等。
2、分词器 :分词器按照分词器的特性,将文本按照特性的格式(比如简单分词器按照空格、横线等)将文本切分成多个词条。
3、token过滤器:将分词器拆分的词条进行标准化处理,转换单词小写,无用的词条的删除(a、an等),词条增加等。
通过上面的分词器、过滤器的操作文本就可以拆分成最终的词条,我们使用这些词条建立倒排索引就可以进行查询了。
下面是几种分词器:
1、标准分词器:这是elesticsearch默认的分词器,也是绝大数应用使用的分词器。他采用unicode标准进行文本的拆分,去掉绝大多是标点,最后将词条标准话小写。
2、简单分词器:将文本在不是字母的地方进行分词。最后将词条小写。
3、空格分词器:空格分词器在空格的地方进行分词。他不会词条的大小写处理。
4、语言分词器:特定语言的分词器,会根据语言进行文本的特殊处理。比如英文分词器会自动删除不必要的,对于相关性较小的分词。提取词干等。
什么时候使用分词器?
我们在文本录入的时候文本会被分词器进行拆分分词。建立倒排索引。
在我们进行查询的时候我们必须要保证我们的查询文本也是使用同一种分词器进行分词,这样我们才能保证我们搜索的词条格式和索引的词条格式是一致的。

ElasticSearch入门

ElasticSearch

技术图片

全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。

它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。

概念

Elastic会索引所有字段,查询就是查索引。

1,索引(Index)是Elastic数据管理的顶层单位,一个索引就是一个数据库。索引名称必须小写。

2,Index 里的记录称为文档(Document),多条Document组成一个Index,Document是Json格式。

3,Document文档可以分组(Type),是虚拟的逻辑分组,用来过滤Document

技术图片

实操

0,

显示所有Index:curl -X GET ‘http://localhost:9200/_cat/indices?v‘

显示所有Type:curl ‘localhost:9200/_mapping?pretty=true‘

1,

新建Index,向Elastic服务器发送PUT请求,名为weather:curl -X PUT ‘localhost:9200/weather’

删除Index,发送DELETE请求:curl -X DELETE ‘localhost:9200/weather’

2,

新增记录,向指定Index/Type发请求:

# 向accounts索引Type组中新增记录

# 方式一:发送PUT请求,要指定该条记录的ID,下例中为1,ID不一定是数字,任何字符串都可以。
curl -X PUT ‘localhost:9200/accounts/person/1‘ -H ‘Content-Type: application/json‘ -d ‘
{
  "user": "张三",
  "title": "工程师",
  "desc": "数据库管理"
}‘ 

# 方式二:发送POST请求,ID会随机创建,和方式一等价。
curl -X POST ‘localhost:9200/accounts/person‘ -H ‘Content-Type: application/json‘ -d ‘
{
  "user": "张三",
  "title": "工程师",
  "desc": "数据库管理"
}‘

删除记录,发送DELETE请求,删除accounts索引person组中ID等于1的记录:curl -X DELETE ‘localhost:9200/accounts/person/1‘

更新记录,发送PUT请求,更新ID等于1的记录:

curl -X PUT ‘localhost:9200/accounts/person/1‘ -H ‘Content-Type: application/json‘ -d ‘
{
    "user" : "张三",
    "title" : "工程师",
    "desc" : "数据库管理,软件开发"
}‘ 
# 更新返回的数据中,该记录version从1变为2,记录更新次数

查看记录,发送GET请求,accounts索引person分组ID为1的记录:

curl ‘localhost:9200/accounts/person/1?pretty=true‘
# pretty=true以易读的格式返回。ID不存在就查不到数据。

3,

数据查询

查询所有记录,GET请求:

curl ‘localhost:9200/accounts/person/_search‘

# response中:took表示耗时(毫秒)、time_out表示是否超时、hits表示命中的记录

全文搜索

# 查询accounts索引person组的记录,条件是desc字段包含”软件“二字
curl ‘localhost:9200/accounts/person/_search‘ -H ‘Content-Type: application/json‘ -d ‘
{
  "query" : { "match" : { "desc" : "软件" }}
}‘

# Elastic默认返回10条记录,size字段可设置返回记录条数,from字段表示位移,从哪个位置开始,默认从0开始
#{
#  "query" : { "match" : { "desc" : "软件" }},
#  "from": 1,
#  "size": 5
#}

逻辑运算

有多个条件,默认or

# 软件 or 系统
curl ‘localhost:9200/accounts/person/_search‘ -H ‘Content-Type: application/json‘ -d ‘
{
  "query" : { "match" : { "desc" : "软件 系统" }}
}‘

要执行and,必须使用布尔查询

# 软件 and 系统
curl ‘localhost:9200/accounts/person/_search‘ -H ‘Content-Type: application/json‘ -d ‘
{
  "query": {
    "bool": {
      "must": [
        { "match": { "desc": "软件" } },
        { "match": { "desc": "系统" } }
      ]
    }
  }
}‘

以上是关于elasticSearch精确索引和全文索引的主要内容,如果未能解决你的问题,请参考以下文章

elasticsearch基本使用

干货 Elasticsearch 知识点整理二

搜索模板elasticsearch

ELK原理

全文搜索之MySQL与ElasticSearch搜索引擎

ES(ElasticSearch) 索引创建