Elasticsearch全文搜索引擎浅析

简介:

         Elastic 的底层是开源库Luence。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。搜索引擎在对数据构建索引时,需要进行分词处理。分词是指将一句话拆解成多个单字或词,这些字或词便是这句话的关键词。如

设置远程访问:

        默认情况下,Elastic 只允许本机访问,如果需要远程访问,可以修改 Elastic 安装目录的config/elasticsearch.yml文件,去掉network.host的注释,将它的值改成0.0.0.0,然后重新启动 Elastic。线上服务不要这样设置,要设成具体的 IP。

安装中文分词插件:

      Elasticsearch 不支持对中文进行分词建立索引,需要配合扩展elasticsearch-analysis-ik来实现中文分词处理。,也可以考虑其他插件(比如 smartcn)。

基本概念:

1.Node 与 Cluster:

    单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。

2.Index:

curl -X GET 'http://localhost:9200/_cat/indices?v'    #当前节点的所有 Index

    Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。

所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。

3.Document:

Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。

4.Type:

$ curl 'localhost:9200/_mapping?pretty=true'   #列出每个 Index 所包含的 Type。

  Document 可以分组,比如weather这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。不同的 Type 应该有相似的结构(schema),举例来说,id字段不能在这个组是字符串,在另一个组是数值。这是与关系型数据库的表的一个区别。性质完全不同的数据(比如productslogs)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。

注意:根据规划,Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。

数据的操作:

1.新增数据:

向指定的 /Index/Type 发送 PUT 请求,就可以在 Index 里面新增一条记录。比如,向/accounts/perople/发送请求,就可以新增一条人员记录。

$ curl -X PUT 'localhost:9200/accounts/perople/1' -d '
{
  "user": "李四",
  "title": "建筑师",
  "desc": "数据库管理"
}'

2.删除数据:

删除记录就是发出 DELETE 请求。

$ curl -X DELETE 'localhost:9200/accounts/people/1'

3.更新数据:

更新记录就是使用 PUT 请求,重新发送一次数据。

$ curl -X PUT 'localhost:9200/accounts/people/1' -d '
{
    "user" : "李四",
    "title" : "建筑师",
    "desc" : "数据库管理,软件开发"
}' 

{
  "_index":"accounts",
  "_type":"person",
  "_id":"1",
  "_version":2,
  "result":"updated",
  "_shards":{"total":2,"successful":1,"failed":0},
  "created":false
}

4.查询数据:

使用 GET 方法,直接请求/accounts/people/search,就会返回所有记录。

$ curl 'localhost:9200/accounts/people/search'

{
  "took":2,
  "timed_out":false,
  "_shards":{"total":5,"successful":5,"failed":0},
  "hits":{
    "total":2,
    "max_score":1.0,
    "hits":[
      {
        "_index":"accounts",
        "_type":"person",
        "_id":"AV3qGfrC6jMbsbXb6k1p",
        "_score":1.0,
        "_source": {
          "user": "李四",
          "title": "工程师",
          "desc": "系统管理"
        }
      },
      {
        "_index":"accounts",
        "_type":"person",
        "_id":"1",
        "_score":1.0,
        "_source": {
          "user" : "张三",
          "title" : "工程师",
          "desc" : "数据库管理,软件开发"
        }
      }
    ]
  }
}

5.全文搜索:

    Elastic 的查询非常特别,使用自己的查询语法,要求 GET 请求带有数据体。

$ curl 'localhost:9200/accounts/person/_search'  -d '
{
  "query" : { "match" : { "desc" : "匹配条件" }}
}'

 Elastic 默认一次返回10条结果,可以通过size字段改变这个设置。

$ curl 'localhost:9200/accounts/person/_search'  -d '
{
  "query" : { "match" : { "desc" : "匹配条件" }},
  "size": 1
}'

还可以通过from字段,指定位移。

$ curl 'localhost:9200/accounts/person/_search'  -d '
{
  "query" : { "match" : { "desc" : "匹配条件" }},
  "from": 1,
  "size": 1
}'

上面代码指定,从位置1开始(默认是从位置0开始),只返回一条结果。

6.逻辑运算:

如果有多个搜索关键字, Elastic 认为它们是or关系。

$ curl 'localhost:9200/accounts/person/_search'  -d '
{
  "query" : { "match" : { "desc" : "匹配条件一 匹配条件二" }}
}'

上面代码搜索的是 匹配条件一 or 匹配条件二。

如果要执行多个关键词的and搜索,必须使用布尔查询。

$ curl 'localhost:9200/accounts/people/search'  -d '
{
  "query": {
    "bool": {
      "must": [
        { "match": { "desc": "匹配条件一" } },
        { "match": { "desc": "匹配条件二" } }
      ]
    }
  }
}'

参考链接:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值