ElastciSearch简单总结(笔记)

前言:

  前段时间在项目中使用了es,作为一个当前比较流行的分布式搜索引擎,在学习和使用它的过程中,踩了不少坑,这篇文章先简单整理了一下,后续会整理一下之前踩过的一些坑。 

1. ElastciSearch是什么

  ElasticSearch是一个基于Apache Lucene的开源搜索引擎。它不仅仅是Lucene和全文搜索,我们还能这样去描述他:

    • 分布式的实时文件存储,每个字段都被索引并可被搜索
    • 分布式的实时搜索引擎
    • 可以扩展到上百台服务器

2. ElasticSearch的安装与配置

  安装方法网上很多,http://blog.csdn.net/whxaing2011/article/details/18237733

  配置:elasticsearch.yml

3. 与ElasticSearch的交互

  ElasticSearch提供多种语言的客户端API,详见

  ElasticSearcg为.NET用户提供了三种客户端, 

  • ElasticSearch.NET

    一个非常底层且灵活的客户端

  • NEST

    ElasticSearch的官方客户端,具有非常简洁的API。可以映射所有请求和响应对象,拥有一个强类型查询DSL。依赖ElasticSearch.NET客户端。

  • PlainElastic.Net

    PlainElastic.net是一个Github开源项目。关于它和ElasticSearch.NET/NEST的活跃度对比。

4. 面向文档

  ElasticSearch是面向文档的,在ES中可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。这种理解数据的方式和以往关系型数据库不同,这也是ES能够执行复杂的全文搜索的原因之一。

5. 对索引的理解

  在ElasticSearch中存储数据的行为就叫做索引(Index),前面所说的文档归属于不同种类型(Type),而这些类型存在于索引。

  数据库->表->行->列  对应es中 索引->类型->文档->字段

  索引的创建

  语法:

PUT /indextest/people/1
{
    "name":"张三",
    "age": 25,
    "sex": "",
    "interests":["体育", "音乐"]
}               

  通过HTTP的GET方法来检索文档,同样的,可以通过DELETE方法来删除文档,如果想要更新就在PUT一次。

6. 搜索

        语法:GET /indextest/people/1

     DELETE /indextest /people/1

    简单搜索

  搜索全部的病人信息 

    语法:GET /elasticsearch1/patient/_search

  这里,我们在结尾使用关键字_search来取代原来的文档ID。返回的结果中hits数组中包含了我们所有的文档。

     接下来,让我们搜索年龄大于35的患者

          GET /elasticsearch1/patient/_search?q=Pat_Age:>35

       这种方法叫做查询字符串(query string)搜索,像传递URL参数一样传递语句

    使用DSL语句查询

  查询字符串搜索有局限性,ES还提供了丰富灵活的查询语言叫做DSL查询,它可以构建更加复杂强大的查询。DSL以JSON请求体的形式出现。

GET /elasticsearch1/patient/_search
{
    "query" : {
        "range" : {
            "Pat_Age" : {
              "gt": 35
           }
        }
    }
}

  更复杂的查询

GET /elasticsearch1/patient/_search
{
    "query" : {
        "bool": {
            "must": [
               {
                   "term": {
                      "Pat_Marital": {
                         "value": "已婚"
                      }
                   }
               },
               {
                   "range" : {
                        "Pat_Age" : {
                          "gt": 35
                       }
                   }
               }
            ]
        }
    }
}

     加过滤器

GET /elasticsearch1/patient/_search
{
    "query" : {
        "filtered": {
           "query": {
                   "bool": {
                    "must": [
                       {
                           "term": {
                              "Pat_Marital": {
                                 "value": "已婚"
                              }
                           }
                       },
                       {
                           "range" : {
                                "Pat_Age" : {
                                  "gt": 35
                               }
                           }
                       }
                    ]
                }
           },
           "filter": {
               "term": {
                  "Pat_Gender": "男"
               }
           }
        }
    }
}

  ElasticSearch也提供了这种特殊的缓存,filter cache来存储filters得到的结果集。此外,缓存filters不需要太多的内存(它只保留一种信息,即哪些文档与filter相匹配),同时它可以由其它的查询复用,极大地提升了查询的性能。

  并非所有的filters都会缓存,默认情况下,如下的filters不会被缓存:

Query查询对象会将所有的条件绑定到一起存储到缓存中,只要有一个条件改变就不能重用。

    全文搜索

  接下来介绍全文搜索—一种传统数据库不好实现的搜索

     如搜索所有得糖尿病又得高血压的病人

GET /patientcase/patientcase/_search
{
    "query" : {
        "match" : {
            "Case_HDSD00_11_076" : "高血压糖尿病"
        }
    }
}

  如下,用来标识匹配到的单词高亮

GET /patientcase/patientcase/_search
{
    "query" : {
        "match" : {
            "Case_HDSD00_11_076" : "高血压糖尿病"
        }
    },
    "highlight": {
        "fields" : {
            "Case_HDSD00_11_076" : {}
        }
    }
}

    query_string

  参数:

          这里只挑几个常用的参数说一下,其他的一般默认就够了

          query:需要查询的具体内容

          default_field:查询的字段

     default_operator:默认运算符

GET /patientcase/patientcase/_search
{
    "query" : {
        "query_string":{
            "default_field":"name",
            "query":"张*"
        }
    }
}

    聚合

  ES可以通过聚合做一些分析统计

GET /elasticsearch1/patient/_search
{
    "filter": {
        "has_child": {
           "type": "adm",
           "query": {
               "term": {
                  "Adm_AdmDiagnos": {
                     "value": "高血压"
                  }
               }
           }
        }
    },
    "aggs" : {
        "avg_age" : {
            "terms" : { "field" : "Pat_Gender" }
        }
    }
}

  相关资料:

      Mastering Elasticsearch(中文版)  http://udn.yyuap.com/doc/mastering-elasticsearch/index.html

      ElasticSearch权威中文版  https://es.xiaoleilu.com/

   ElasticSearch英文API  https://www.elastic.co/guide/en/elasticsearch/client/index.html

      ES相关插件  http://www.cnblogs.com/huangfox/p/3541300.html

 

转载于:https://www.cnblogs.com/felix-hpp/p/8939934.html

你可能感兴趣的:(ElastciSearch简单总结(笔记))