[ElasticSearch][使用](1.7.1) 2015-08-05 19:00

说明

使用ElasticSearch的两种方式,一是使用Java API(又分为Node client和Transport client),另一种是使用RESTful API。

本文介绍第二种方法,RESTful API的基本功能使用。

概念说明

传统关系型数据库与ElasticSearch的对比。

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

本例中,Indices为abc,Types为employee

基本用法

提供文档到ElasticSearch进行索引

curl -XPUT 'http://localhost:9200/abc/employee/1' -d '
{
    "first_name" : "cheyo",
    "last_name" :  "hou",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}
'
curl -XPUT 'http://localhost:9200/abc/employee/2' -d '
{
    "first_name" :  "Jane",
    "last_name" :   "Smith",
    "age" :         32,
    "about" :       "I like to collect rock albums",
    "interests":  [ "music" ]
}
' | python -mjson.tool

查询被索引文档的详细内容

curl -XGET 'http://localhost:9200/abc/employee/1'

搜索

  • 搜索出所有的被索引文档
curl -XGET 'http://localhost:9200/abc/employee/_search'
  • 指定关键Field进行搜索
curl -XGET 'http://localhost:9200/abc/employee/_search?q=last_name:hou'
  • 指定关键Field进行搜索(Search Lite)
curl -XGET 'http://localhost:9200/abc/employee/_search' -d '
{
    "query" : {
        "match" : {
            "last_name" : "hou"
        }
    }
}
'
  • 指定关键Field进行精确搜索(使用Query DSL)
curl -XGET 'http://localhost:9200/abc/employee/_search' -d '
{
    "query" : {
        "filtered" : {
            "filter" : {
                "range" : {
                    "age" : { "gt" : 30 } 
                }
            },
            "query" : {
                "match" : {
                    "last_name" : "smith" 
                }
            }
        }
    }
}
'
  • 全文检索

只含有部分关键字的文档也会被检索出来,结果中包含匹配度。

curl -XGET 'http://localhost:9200/abc/employee/_search' -d '
{
    "query" : {
        "match" : {
            "about" : "rock climbing"
        }
    }
}
'
  • 全文精确检索

必须同时含有所有的关键字:

curl -XGET 'http://localhost:9200/abc/employee/_search' -d '
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    }
}
'
  • 高亮检索结果关键字
curl -XGET 'http://localhost:9200/abc/employee/_search' -d '
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    },
    "highlight": {
        "fields" : {
            "about" : {}
        }
    }
}
' | python -mjson.tool

统计分析

  • 统计某一个Field的总数排名
curl -XGET 'http://localhost:9200/abc/employee/_search' -d '
{
  "aggs": {
    "all_interests": {
      "terms": { "field": "interests" }
    }
  }
}
' | python -mjson.tool
  • 限定范围统计排名

只统计last_name为smith的人,其interest的统计排名

curl -XGET 'http://localhost:9200/abc/employee/_search' -d '
{
  "query": {
    "match": {
      "last_name": "smith"
    }
  },
  "aggs": {
    "all_interests": {
      "terms": {
        "field": "interests"
      }
    }
  }
}
' | python -mjson.tool
  • 统计排名可以嵌套

只统计last_name为smith的人,其interest的个数统计排名,平均年龄:

curl -XGET 'http://localhost:9200/abc/employee/_search' -d '
{
    "aggs" : {
        "all_interests" : {
            "terms" : { "field" : "interests" },
            "aggs" : {
                "avg_age" : {
                    "avg" : { "field" : "age" }
                }
            }
        }
    }
}
' | python -mjson.tool

参考文档

1. 官方文档

Tags: #ElasticSearch    Post on Hadoop