ElasticSeach全文检索

这个我就当自己做笔记了!!!!!!

还是得多用,用多了你可能不知道原理,但你至少会用,更容易理解。

这个技术就相当于你百度一个东西,很多相似的东西都会出来,这个的使用场景和这个差不多,不过在存的时候就得说明是什么查找方法,后面写。。。。

刚开始,可能对很多概念不确定:(概念懒得看就看看标题先了解下)

我们可以和数据库里面的几个概念对应:

Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields

1 索引 index(相当于Database一个库概念):

一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产 品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并 且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在 一个集群中,可以定义任意多的索引。

2 类型 type(相当于一个库里面的表概念):

在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完 全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平 台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数 据定义另一个类型,当然,也可以为评论数据定义另一个类型。

3 字段Field(相当于表里面的一列概念):

相当于是数据表的字段,对文档数据根据不同属性进行的分类标识。

4 映射 mapping:

mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被 索引等等,这些都是映射里面可以设置的,其它就是处理es里面数据的一些使用规则设置也叫做映射, 按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能 更好。

5 文档 document (相当于一行数据的概念):

一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文 档,当然,也可以拥有某个订单的一个文档。文档以JSON(Javascript Object Notation)格式来表示, 而JSON是一个到处存在的互联网数据交互格式。 在一个index/type里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之 中,文档必须被索引/赋予一个索引的type。

6 接近实时 NRT:

Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一 个轻微的延迟(通常是1秒以内)。

7 集群 cluster:

一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。 一个集群由一个唯一的名字标识,这个名字默认就是“elasticsearch”。这个名字是重要的,因为一个节 点只能通过指定某个集群的名字,来加入这个集群。

Elasticsearch 安装:自己找资源吧,我就不多说了(客户端操作的话:

第一种,elasticsearch-head插件(建议,对我这种小白很友好

第二种,使用elasticsearch提供的Restful接口直接访问

第三种,使用elasticsearch提供的API进行访问)。

api使用就先记着这几个吧:put:相当于创建一个东西,post:添加(修改),delete:删除

查询的话:

(查询文档-querystring查询)POST 192.168.***。***:9200/blog1/article/_search

请求体的话:

{
  "query": {
    "query_string": {
      "default_field": "title",
      "query": "搜索服务器"
    }
  }
}

( 查询文档-term查询)

POST 192.168.220.100:9200/blog1/article/_search

请求体:

{
  "query": {
    "term": {
      "title": "搜索"
    }
  }
}

两个区别:query_string:搜索之前对搜索的关键词分词 term:对搜索的关键词不分词

IK分词器:

下载啥的自己去看看。

最重要的两个作用:

ik_max_word:会将文本做最细粒度的拆分

比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民共 和国、人民、共和国、大会堂、大会、会堂等词语。

ik_smart:会做最粗粒度的拆分

比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。

DSL语句使用:

(1)查询所有索引:GET /_cat/indices?v

(2)删除某个索引:DELETE /skuinfo

(3)新增索引:PUT /user

(4)创建映射:

PUT /user/userinfo/_mapping
{
    "properties": {
        "name":{
            "type": "text",
            "analyzer": "ik_smart",//分词用这个
            "search_analyzer": "ik_smart"//查词用这个
        },
        "city":{
                "type": "text",
                "analyzer": "ik_smart",
                "search_analyzer": "ik_smart"
        },
        "age":{
                "type": "long"
        },
        "description":{
                "type": "text",
                "analyzer": "ik_smart",
                "search_analyzer": "ik_smart"
        }
    }
}

(5)新增文档数据:

PUT /user/userinfo/1
{
    "name":"李四",
    "age":22,
    "city":"深圳",
    "description":"李四来自湖北武汉!"
}

(6)修改数据:

#更新数据,id=4
PUT /user/userinfo/4
{
    "name":"张三丰",
    "description":"在武汉读书,家在武汉!在深圳工作!"
}

(7)删除Document:DELETE user/userinfo/7

(1)查询所有数据:#查询所有 GET /user/_search

(2)根据ID查询:#根据ID查询 GET /user/userinfo/2

(3)Sort排序:

#搜索排序
GET /user/_search
{
    "query":{
        "match_all": {}
    },
    "sort":{
        "age":{
            "order":"desc"
        }
    }
}

(4)分页:from:从下N的记录开始查询 size:每页显示条数

#搜索排序
GET /user/_search
{
    "query":{
        "match_all": {}
    },
    "sort":{
        "age":{
            "order":"desc"
        }
    },
    "from": 0,
    "size": 2
}

(1)term查询

term主要用于分词精确匹配,如字符串、数值、日期等(不适合情况:1.列中除英文字符外有其它值 2. 字符串值中有冒号或中文 3.系统自带属性如_version)

#查询-term
GET _search
{
    "query":{
        "term":{
            "city":"武汉"
        }
    }
}

(2) terms 查询

terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需 要一起去做匹配 。

#查询-terms 允许多个Term
GET _search
{
    "query":{
        "terms":{
            "city":
                [
                    "武汉",
                    "广州"
                ]
            }
        }
}

3)match查询:

GET _search
{
    "query": {
        "match": {
            "city": "广州武汉"
        }
    }
}

(4)query_string查询:

GET _search
{
    "query": {
        "query_string": {
            "default_field": "city",
            "query": "广州武汉"
        }
    }
}

(3) range 查询

range过滤允许我们按照指定范围查找一批数据。例如我们查询年龄范围

#-range 范围过滤
#gt表示> gte表示=>
#lt表示< lte表示<=
GET _search
{
    "query":{
        "range": {
            "age": {
                "gte": 30,
                "lte": 57
            }
        }
    }
}

(4)exists

exists 过滤可以用于查找拥有某个域的数据

#搜索 exists:是指包含某个域的数据检索
GET _search
{
    "query": {
        "exists":{
            "field":"address"
        }
    }
}

(5) bool 查询

bool 可以用来合并多个条件查询结果的布尔逻辑,它包含一下操作符:

must : 多个查询条件的完全匹配,相当于 and。

must_not : 多个查询条件的相反匹配,相当于 not。

should : 至少有一个查询条件匹配, 相当于 or。 这些参数可以分别继承一个过滤条件或者一个过滤条件的数组:

#过滤搜索 bool
#must : 多个查询条件的完全匹配,相当于 and。
#must_not : 多个查询条件的相反匹配,相当于 not。
#should : 至少有一个查询条件匹配, 相当于 or。
GET _search
{
    "query": {
        "bool": {
            "must": [
        {
        "term": {
            "city": {
                "value": "深圳"
                }
            }
        },
        {
            "range":{
                "age":{
                    "gte":20,
                    "lte":99
                        }
                    }
                }
            ]
        }
    }
}

(6) match_all 查询

可以查询到所有文档,是没有查询条件下的默认语句。

#查询所有 match_all
GET _search
{
    "query": {
        "match_all": {}
    }
}

(7) match 查询

match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。 如果你使用 match 查询一个全文本字段,它会在真正查询之前用分析器先分析match一下查询字符

#字符串匹配
GET _search
{
    "query": {
        "match": {
            "description": "武汉"
        }
    }
}

(8)prefix 查询

以什么字符开头的,可以更简单地用 prefix ,例如查询所有以张开始的用户描述

#前缀匹配 prefix
GET _search
{
    "query": {
        "prefix": {
            "name": {
                "value": "赵"
            }
        }
    }
}

(9)multi_match 查询

multi_match查询允许你做match查询的基础上同时搜索多个字段,在多个字段中同时查一个

 

#多个域匹配搜索
GET _search
{
    "query": {
        "multi_match": {
            "query": "深圳",
            "fields": [
                "city",
                "description"
            ]
        }
    }
}

说实话,我觉得最重要的是这九个查询的,和数据库查询的差不多了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值