elasticsearch 学习笔记1

1.几个基本概念介绍

一个 Elasticsearch 集群可以包含多个索引,相应的每个索引可以包含多个类型。这些不同的类型存储着多个文档,每个文档又有多个属性

  • 索引(index)相当于关系型数据库中的dbname.
  • 类型 (type) 相当于关系型数据库中的Table
  • 文档(document)相当于关系型数据库中的记录
  • 属性,相当于关系型数据库中的字段

2.实例介绍

对于雇员目录,我们将做如下操作:

  • 每个雇员索引一个文档,包含该雇员的所有信息。
  • 每个文档都将是employee类型
  • 该类型位于索引megacorp内。
  • 该索引保存在我们的 Elasticsearch 集群中

注:一下实例中的命令都是curl的简写形式,
具体省略的包括curl -XPUT 'http://192.168.0.103:9200/megacorp/employee/1'

PUT /megacorp/employee/1
{
    "first_name" : "John",
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}

注意,路径 /megacorp/employee/1 包含了三部分的信息:

  • megacorp 索引名称
  • employee 类型名称
  • 1 特定雇员的ID

让我们增加更多的员工信息到目录中:

PUT /megacorp/employee/2
{
    "first_name" :  "Jane",
    "last_name" :   "Smith",
    "age" :         32,
    "about" :       "I like to collect rock albums",
    "interests":  [ "music" ]
}

3.检索文档

指定id参数会检索指定id的文档

GET /megacorp/employee/1
{
  "_index" :   "megacorp",
  "_type" :    "employee",
  "_id" :      "1",
  "_version" : 1,
  "found" :    true,
  "_source" :  {
      "first_name" :  "John",
      "last_name" :   "Smith",
      "age" :         25,
      "about" :       "I love to go rock climbing",
      "interests":  [ "sports", "music" ]
  }
}

4.轻量检索

直接加_search,返回结果包括了所有三个文档,放在数组 hits 中。一个搜索默认返回十条结果。返回结果不仅告知匹配了哪些文档,还包含了整个文档本身:显示搜索结果给最终用户所需的全部信息。

GET /megacorp/employee/_search
{
   "took":      6,
   "timed_out": false,
   "_shards": { ... },
   "hits": {
      "total":      3,
      "max_score":  1,
      "hits": [
         {
            "_index":         "megacorp",
            "_type":          "employee",
            "_id":            "3",
            "_score":         1,
            "_source": {
               "first_name":  "Douglas",
               "last_name":   "Fir",
               "age":         35,
               "about":       "I like to build cabinets",
               "interests": [ "forestry" ]
            }
         },
         {
            "_index":         "megacorp",
            "_type":          "employee",
            "_id":            "1",
            "_score":         1,
            "_source": {
               "first_name":  "John",
               "last_name":   "Smith",
               "age":         25,
               "about":       "I love to go rock climbing",
               "interests": [ "sports", "music" ]
            }
         },
         {
            "_index":         "megacorp",
            "_type":          "employee",
            "_id":            "2",
            "_score":         1,
            "_source": {
               "first_name":  "Jane",
               "last_name":   "Smith",
               "age":         32,
               "about":       "I like to collect rock albums",
               "interests": [ "music" ]
            }
         }
      ]
   }
}

高亮搜索,在_search后加上搜索参数q=''

GET /megacorp/employee/_search?q=last_name:Smith
{
   ...
   "hits": {
      "total":      2,
      "max_score":  0.30685282,
      "hits": [
         {
            ...
            "_source": {
               "first_name":  "John",
               "last_name":   "Smith",
               "age":         25,
               "about":       "I love to go rock climbing",
               "interests": [ "sports", "music" ]
            }
         },
         {
            ...
            "_source": {
               "first_name":  "Jane",
               "last_name":   "Smith",
               "age":         32,
               "about":       "I like to collect rock albums",
               "interests": [ "music" ]
            }
         }
      ]
   }
}

5.查询表达式搜索

领域特定语言DSL指定了使用一个 JSON 请求。我们可以像这样重写之前的查询所有 Smith 的搜索

GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}

更复杂一些的查询:

GET /megacorp/employee/_search
{
    "query" : {
        "bool": {
            "must": {
                "match" : {
                        "last_name" : "smith"
                 }
            },
            "filter": {
                "range" : {
                           "age" : { "gt" : 30 }
                 }
            }
        }
    }
}

现在结果只返回了一个雇员,叫 Jane Smith,32 岁。

{
   ...
   "hits": {
      "total":      1,
      "max_score":  0.30685282,
      "hits": [
         {
            ...
            "_source": {
               "first_name":  "Jane",
               "last_name":   "Smith",
               "age":         32,
               "about":       "I like to collect rock albums",
               "interests": [ "music" ]
            }
         }
      ]
   }
}

7.全文搜索

以上介绍的都是简单的查询,现在尝试下稍微高级点儿的全文搜索

GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "about" : "rock climbing"
        }
    }
}

举个更加具体的Python示例:

def main():
    # es = Elasticsearch(es_hosts)
    es = Elasticsearch(es_hosts, http_auth=es_auth)
    #res = es.get(index=index_name, doc_type=doc_type, id='AWA7wc7KqvKHwbnCSiGf')['_source']
    # res = es.search(index=index_name, body={"query": {"match_all": {}}})
    res = es.search(index=index_name, body={"query": {"match": {"consignee": "张前程"}}})
    pprint(res)


if __name__ == '__main__':
    main()

上述示例会查询出所有consignee字段匹配到张、前、程当个其中一个或多个的结果。

8.短语搜索

找出一个属性中的独立单词是没有问题的,但有时候想要精确匹配一系列单词或者短语。比如, 我们想执行这样一个查询,仅匹配同时包含 “rock”“climbing” ,并且二者以短语 “rock climbing” 的形式紧挨着的雇员记录。

GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    }
}

还是上面那个【python】示例,

def main():
    # es = Elasticsearch(es_hosts)
    es = Elasticsearch(es_hosts, http_auth=es_auth)
    #res = es.get(index=index_name, doc_type=doc_type, id='AWA7wc7KqvKHwbnCSiGf')['_source']
    # res = es.search(index=index_name, body={"query": {"match_all": {}}})
    # res = es.search(index=index_name, body={"query": {"match": {"consignee": "张前程"}}})
    res = es.search(index=index_name, body={"query": {"match_phrase": {"consignee": "张前程"}}})
    pprint(res)


if __name__ == '__main__':
    main()

上述示例仅仅匹配consignee字段为张前程的结果

9.高亮搜索

许多应用都倾向于在每个搜索结果中高亮部分文本片段,以便让用户知道为何该文档符合查询条件。在 Elasticsearch 中检索出高亮片段也很容易

GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    },
    "highlight": {
        "fields" : {
            "about" : {}
        }
    }
}

上述【python】示例的版本

def main():
    # es = Elasticsearch(es_hosts)
    es = Elasticsearch(es_hosts, http_auth=es_auth)
    #res = es.get(index=index_name, doc_type=doc_type, id='AWA7wc7KqvKHwbnCSiGf')['_source']
    # res = es.search(index=index_name, body={"query": {"match_all": {}}})
    # res = es.search(index=index_name, body={"query": {"match": {"consignee": "张前程"}}})
    res = es.search(index=index_name, body={"query": {"match_phrase": {"consignee": "张前程"}}, "highlight":{"fields":{"consignee":{}}}})
    pprint(res)


if __name__ == '__main__':
    main()

查询结果中还多了一个叫做 highlight 的部分。


image.png

当然了,我们还可以指定标签

def main():
    # es = Elasticsearch(es_hosts)
    es = Elasticsearch(es_hosts, http_auth=es_auth)
    #res = es.get(index=index_name, doc_type=doc_type, id='AWA7wc7KqvKHwbnCSiGf')['_source']
    # res = es.search(index=index_name, body={"query": {"match_all": {}}})
    # res = es.search(index=index_name, body={"query": {"match": {"consignee": "张前程"}}})
    res = es.search(index=index_name, body={"query": {"match_phrase": {"consignee": "张前程"}}, "highlight":{"pre_tags" : ["<span>"],
        "post_tags" : ["</span>"],"fields":{"consignee":{}}}})
    pprint(res)


if __name__ == '__main__':
    main()

还有更多高级用法,可查看高亮

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容