es简述

es简述



ES 全称 **ElasticSearch** 是一种分布式全文搜索引擎,基于Lucene(全文搜索框架)开发而来。

ES 虽然是以Lucene核心库开发的,但是却不是以它作为核心,**ES** 的贴点体现在:

*分布式实时文件存储,每个字段皆能索引* 

*集群,可扩展(理论上无上限)*

*高度集成的服务(RESTful风格的API,各语言客户端)*

 composer require elasticsearch/elasticsearch  安装elasticsearch扩展

 

辅助管理工具Kibana5

 

默认访问地址:http://localhost:5601

菜单:

Discover:可视化查询分析器

Visualize:统计分析图表

Dashboard:自定义主面板(添加图表)

Timelion:Timelion是一个kibana时间序列展示组件(暂时不用)

Dev Tools :Console(同CURL/POSTER,操作ES代码工具,代码提示,很方便)

Management:管理索引库(index)、已保存的搜索和可视化结果(save objects)、设置 kibana 服务器属性

 

可以进行可视化获取

在堡垒机上可以通过命令行 :

 

curl -H "Content-Type: application/json" -X GET 'http://localhost:9200/myappname/_search' -d '{"size":10,"from":0,"query":{"bool":{"must":{"match":{"title":{"query":"\u889c\u5b50"}}},"filter":{"term":{"onsale":true}}}},"sort":{"listorder":{"order":"desc"},"id":{"order":"desc"}}}'

基本查询
指定请求头
–header “content-Type:application/json”  

es使用描述

es的类型和数据库是相对应的

索引——》数据库

类型——》数据表

id——》自增字段id(该字段一般只用于已知情况下)

1.几个基本名词

index: es里的index相当于一个数据库。 
type: 相当于数据库里的一个表。 
id: 唯一,相当于主键。 
node:节点是es实例,一台机器可以运行多个实例,但是同一台机器上的实例在配置文件中要确保http和tcp端口不同(下面有讲)。 
cluster:代表一个集群,集群中有多个节点,其中有一个会被选为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。 
shards:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上,构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。 
replicas:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当个某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

上面这些都是在创建es文档的时候设置的

由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。

DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。  

 //查询字符串模式:同样是使用Kibana5

     GET itsource/employee/_search?q=fullName:倪先华

     DSL模式:

 

GET _index/type/id  

 

例如下:

     GET itsource/employee/_search

     {

     "query" : {

        "match" : {

         "fullName" : "倪先华"

               }

          }

     }

使用DSL查询,必须要传递query参数给ES。  

但是7.0之后版本,只用到了索引, type将会自动创建,现在可以看做一个文档一个索引。 创建和查询的时候不需要特意设置type

es搜索的操作类似于数据库的操作,也是增删改查

 

在dsl模式中 通过设置mapping 创建字段   post 插入修改   get获取

 

上面示例:可以视为  

select * from itsource.employee where fullName like '%倪先华%'  sql的模糊查询  

当然   ES 这个也可以进行精确查询可以设置包含百分比,不同的就是es在创建的文档的时候会设置字段的分词器,进行分词查找   

ik是一个中文切词插件,elasticSearch自带的中文切词很不专业,ik对中文切词支持的比较好。

例:

如果想检查ik的切词效果,可以执行:

  1. curl 'http://localhost:9200/myappname/_analyze?analyzer=ik_max_word&pretty=true' -d'

  2. {

  3. "text":"中华人民共和国国歌"

  4. }'

通过返回结果可以看出,ik_max_word切词把中华人民共和国国歌切成了

“中华人民共和国”、“中华人民”、“中华”、“华人”、“人民共和国”、“人民”、“共和国”、

“共和”、“国”、“国歌”

也就是说我们搜索这些词中的任意一个都能把这句话搜到,如果不安装ik插件的话,那只会切成:“中”、“华”、“人”、“民”、“共”、“和”、“国”、“国”、“歌”,不够智能,搜索也不好进行了  

 

 

{
  "tokens" : [
    {
      "token" : "there",      // 分词
      "start_offset" : 0,     // 起始偏移量
      "end_offset" : 5,       // 结束偏移量
      "type" : "<ALPHANUM>",  // 分词的类型
      "position" : 0          // 该分词在文本中的位置
    },
    {
      "token" : "is",
      "start_offset" : 6,
      "end_offset" : 8,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "a",
      "start_offset" : 11,
      "end_offset" : 12,
      "type" : "<ALPHANUM>",
      "position" : 2
    },
    // 省略其他4项
  ]
}

因为es的操作都是json格式的,所以适应起来是非常方便的

在php中使用可以直接用数组对应也可以使用json转数组

$client = new EsClientService();
$client = $client->client();
$params = [
 'index' => 'my_index',
 'type' => 'my_type',
 'body' => [
     'query' => [
         "match" => [ //分词模糊查询
 "name" => "余付"
 ]
 ]
 ]
];
$rt = $client->search($params);

curl -H "Content-Type: application/json" -X GET 'http://x.x.x.x:XXXX/yg_goods_goods/_analyze/?pretty' -d '{ "analyzer": "ik_max_word", "text": "测试用例" }'  查看分词器的分词效果

 

注:1.es查询默认一次只会查询十条数据 这个可以通过设置修改

       2.es在创建文档的时候要注意文档字段的设置(类型和分词器)会影响es的操作

       3.es在使用"minimum_should_match":75%,可以配置一个一个百分比,至少optional clauses至少满足75%,这里是向下取整的。比如有5个clause,5*75%=3.75,向下取整为3,也就是至少需要match 3个clause。数字可以是负数,例如有4个term的匹配,当匹配度为-25%与75%,其意义是一样的,都是最少匹配三个,但处理5个term时,-25%表示至少匹配四个,而75%表示至少匹配三个term。  

 

 

es同一次搜索请求获得不同结果

产生现象的原因

es中主副分片进行refresh过程是相互独立的,当批量持续写入数据时,主副分片中的数据不是严格一致的。 所以同个搜索多次执行的时候,在主副分片来回执行会导致结果“跳动”的情况。
使用preference参数指定搜索的分片就可以保证一次搜索只有一次结果。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读