Elasticsearch搜素引擎入门

来源:互联网 发布:劳务派遣管理系统 php 编辑:程序博客网 时间:2024/05/17 07:44

1、是什么

Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。用于分布式全文检索。

2、API

Elasticsearch为Java用户提供了两种内置客户端。

(1)节点客户端(node client):节点客户端以无数据节点(none data node)身份加入集群,换言之,它自己不存储任何数据,但是它知道数据在集群中的具体位置,并且能够直接转发请求到对应的节点上。

(2)传输客户端(Transport client):这个更轻量的传输客户端能够发送请求到远程集群。它自己不加入集群,只是简单转发请求给集群中的节点。

两个Java客户端都通过9300端口与集群交互,使用Elasticsearch传输协议(Elasticsearch Transport Protocol)。集群中的节点之间也通过9300端口进行通信。

使用基于HTTP协议,以JSON为数据交互格式的RESTful API,通过9200端口的与Elasticsearch进行通信。

通过curl命令与Elasticsearch通信

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

VERB HTTP方法:GET, POST, PUT, HEAD, DELETE

PROTOCOL http或者https协议(只有在Elasticsearch前面有https代理的时候可用)

HOST Elasticsearch集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫localhost

PORT Elasticsearch HTTP服务所在的端口,默认为9200

PATH API路径

QUERY_STRING 一些可选的查询请求参数

BODY 一个JSON格式的请求主体

3、文档

Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。

在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。这种理解数据的方式与以往完全不同,这也是Elasticsearch能够执行复杂的全文搜索的原因之一。

ELasticsearch使用JavaScript 对象表示法(JavaScript Object Notation),也就是JSON,作为文档序列化格式。

4、索引

在Elasticsearch中存储数据的行为就叫做索引(indexing)。

Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

例如:

PUT /megacorp/employee/1

{

    "first_name" : "John",

    "last_name" :  "Smith",

    "age" :        25,

    "about" :      "I love to go rock climbing",

    "interests": [ "sports", "music" ]

}

PUT /megacorp/employee/2

{

    "first_name" :  "Jane",

    "last_name" :   "Smith",

    "age" :         32,

    "about" :       "I like to collect rock albums",

    "interests":  [ "music" ]

}

PUT /megacorp/employee/3

{

    "first_name" :  "Douglas",

    "last_name" :   "Fir",

    "age" :         35,

    "about":        "I like to build cabinets",

    "interests":  [ "forestry" ]

}

5、搜索

(1)简单搜索

例如:GET /megacorp/employee/_search,默认情况下搜索会返回前10个结果

(2)查询字符串(query string)搜索

例如:GET /megacorp/employee/_search?q=last_name:Smith,像传递URL参数一样去传递查询语句

(3)DSL语句查询

DSL,Domain Specific Language特定领域语言,例如:

GET /megacorp/employee/_search

{

    "query" : {

        "match" : {

            "last_name" : "Smith"

        }

    }

}

(4)结构化搜索

例如:

GET /megacorp/employee/_search

{

    "query" : {

        "filtered" : {

            "filter" : {

                "range" : {

                    "age" : { "gt" : 30 } <1>

                }

            },

            "query" : {

                "match" : {

                    "last_name" : "smith" <2>

                }

            }

        }

    }

}

(5)全文搜索

例如:

GET /megacorp/employee/_search

{

    "query" : {

        "match" : {

            "about" : "rock climbing"

        }

    }

}

(6)短语搜索

例如:

GET /megacorp/employee/_search

{

    "query" : {

        "match_phrase" : {

            "about" : "rock climbing"

        }

    }

}

match_phrase查询首先解析查询字符串来产生一个词条列表。然后会搜索所有的词条,但只保留含有了所有搜索词条的文档,并且词条的位置要邻接。

(7)高亮搜索

很多应用喜欢从每个搜索结果中高亮(highlight)匹配到的关键字,这样用户可以知道为什么这些文档和查询相匹配。

GET /megacorp/employee/_search

{

    "query" : {

        "match_phrase" : {

            "about" : "rock climbing"

        }

    },

    "highlight": {

        "fields" : {

            "about" : {}

        }

    }

}

当我们运行这个语句时,会命中与之前相同的结果,但是在返回结果中会有一个新的部分叫做highlight,这里包含了来自about字段中的文本,并且用<em></em>来标识匹配到的单词。

{

   ...

   "hits": {

      "total":      1,

      "max_score":  0.23013961,

      "hits": [

         {

            ...

            "_score":         0.23013961,

            "_source": {

               "first_name":  "John",

               "last_name":   "Smith",

               "age":         25,

               "about":       "I love to go rock climbing",

               "interests": [ "sports", "music" ]

            },

            "highlight": {

               "about": [

                  "I love to go <em>rock</em> <em>climbing</em>"

               ]

            }

         }

      ]

   }

}

6、聚合

Elasticsearch有一个功能叫做聚合(aggregations),它允许你在数据上生成复杂的分析统计。它很像SQL中的GROUP BY但是功能更强大,例如:

GET /megacorp/employee/_search

{

  "aggs": {

    "all_interests": {

      "terms": { "field": "interests" }

    }

  }

}

结果:

{

   ...

   "hits": { ... },

   "aggregations": {

      "all_interests": {

         "buckets": [

            {

               "key":       "music",

               "doc_count": 2

            },

            {

               "key":       "forestry",

               "doc_count": 1

            },

            {

               "key":       "sports",

               "doc_count": 1

            }

         ]

      }

   }

}

聚合也允许分级汇总,例如:

GET /megacorp/employee/_search

{

    "aggs" : {

        "all_interests" : {

            "terms" : { "field" : "interests" },

            "aggs" : {

                "avg_age" : {

                    "avg" : { "field" : "age" }

                }

            }

        }

    }

}

结果:

"all_interests": {

   "buckets": [

      {

         "key": "music",

         "doc_count": 2,

         "avg_age": {

            "value": 28.5

         }

      },

      {

         "key": "forestry",

         "doc_count": 1,

         "avg_age": {

            "value": 35

         }

      },

      {

         "key": "sports",

         "doc_count": 1,

         "avg_age": {

            "value": 25

         }

      }

   ]

}

0 0
原创粉丝点击