首页 > 代码库 > elasticsearch学习入门

elasticsearch学习入门

这几年,搜索的开发门槛越来越低,每个语言都有开源的检索工具包,而且功能越来越全,完整的解决方案也越来越多、越来越好用,比如lucene上就有solr, elasticsearch, sensei等。它们对于绝大部分的需求应该说都覆盖了,解放了直接在检索工具包上的开发工作量,让人可以更多关注业务上的开发。个人比较看好elasticsearch(简称ES),ES的使用非常简单,让人感觉更多地在使用一个Nosql,而且允许很多插件功能可以自己开发。我们可以很容易通过rest客户端去测试ES,因此学习起来很容易。

  ES的官网有比较全面的API,但我看过以后感觉API的层次还是有点乱,至少没有mongodb的文档那么简单易读。从简单的应用开始慢慢认识ES的。比如要搭建个中文新闻信息的搜索引擎,新闻有"标题"、"内容"、"作者"、"类型"、"发布时间"这五个字段;我们要提供"标题和内容的检索"、"排序"、"高亮"、"统计"、"过滤"等一些基本功能。ES提供了smartcn的中文分词插件,测试的话建议使用IK分词插件,也可以看看插件作者给的例子。

  下载安装好插件、启动ES,之后就可以开始ES的体验了。

  1. 创建一个名叫test的索引

  PUT http://localhost:9200/test

  2. 创建mapping

  POST http://localhost:9200/test/news/_mapping

  内容为:

  1. {
  2.     "news": {
  3.       
  4.         "properties": {
  5.             "content": {
  6.                 "type": "string",
  7.                 "store": "no",
  8.                 "term_vector": "with_positions_offsets",
  9.                 "index_analyzer": "ik",
  10.                 "search_analyzer": "ik"
  11.             }
  12. ,
  13.             "title": {
  14.                 "type": "string",
  15.                 "store": "no",
  16.                 "term_vector": "with_positions_offsets",
  17.                 "index_analyzer": "ik",
  18.                 "search_analyzer": "ik",
  19.                 "boost": 5
  20.             }
  21. ,
  22.             "author": {
  23.                 "type": "string","index":"not_analyzed"
  24.             }
  25. ,
  26.             "publish_date": {
  27.                 "type": "date", "format":"yyyy/MM/dd","index":"not_analyzed"
  28.             }
  29. ,
  30.    "category": {
  31.                 "type": "string","index":"not_analyzed"
  32.             }
  33.         }
  34.     }
  35. }
复制代码


  URL的test、news在ES中是索引/类型,感觉是对应数据库像库名/表名的关系,POST内容中properties对应mapping里的内容,里面5个字段。type指出字段类型、内容、标题字段要进行分词和高亮因此要设置分词器和开启term_vector。具体类型的API可以看这里。

  3. 制造并提交一些数据:

  POST http://localhost:9200/test/news/

  内容随便造若干条:

  1. {
  2. "content":"中国国务院总理访问欧洲",
  3. "title":"美国今年经济形势良好",
  4. "publish_date":"2010/07/01",
  5. "author":"张三",
  6. "category":"财经"
  7. }
复制代码


  4. 检索

  POST http://localhost:9200/test/news/_search

  内容包括几个部分:

  分页:from/size、字段:fields、排序sort、查询:query、过滤:filter、高亮:highlight、统计:facet

  1. {
  2. "from":0,
  3. "size":10,
  4. "fields":["title","content","publish_date","category", "author"],
  5. "sort":[
  6.         { "publish_date" : {"order" : "asc"} },
  7.         "_score"
  8. ],
  9.         "query":{
  10. "bool":{
  11. "should" : [
  12.             {
  13.                 "term" : { "title" : "中国" }
  14.             },
  15.             {
  16.                 "term" : { "content" : "中国" }
  17.             }
  18.         ]}
  19. },
  20. "filter":{
  21.   "range" : {
  22.                 "publish_date" : {
  23.                     "from" : "2010/07/01",
  24.                   "to" : "2010/07/21",
  25.                   "include_lower" : true,
  26.                   "include_upper" : false
  27.                 }
  28.             }
  29. },
  30. "highlight" : {
  31.         "pre_tags" : ["<tag1>", "<tag2>"],
  32.         "post_tags" : ["</tag1>", "</tag2>"],
  33.         "fields" : {
  34.             "title" : {},
  35. "content" : {}
  36. }
  37. },
  38. "facets" : {
  39.      "cate" : { "terms" : {"field" : "category"} }
  40.     }
  41. }
  42. 这里query我选择构造了个标题或内容中含”中国“,
  43. 结果如下:
  44. {
  45.   "took" : 18,
  46.   "timed_out" : false,
  47.   "_shards" : {
  48.     "total" : 5,
  49.     "successful" : 5,
  50.     "failed" : 0
  51.   },
  52.   "hits" : {
  53.     "total" : 6,
  54.     "max_score" : null,
  55.     "hits" : [ {
  56.       "_index" : "test",
  57.       "_type" : "news",
  58.       "_id" : "_FM13zCCSnWaTPOuzIok_A",
  59.       "_score" : 0.024621923,
  60.       "fields" : {
  61.         "content" : "路透社报道,美国昨天在伊拉克如何如何,中国将如何面对形势。",
  62.         "author" : "张三",
  63.         "title" : "美国留给伊拉克的是个烂摊子",
  64.         "category" : "政治",
  65.         "publish_date" : "2010/07/10"
  66.       },
  67.       "highlight" : {
  68.         "content" : [ "路透社报道,美国昨天在伊拉克如何如何,<tag2>中国</tag2>将如何面对形势。" ]
  69.       },
  70.       "sort" : [ 1278720000000, 0.024621923 ]
  71.     }, {
  72.       "_index" : "test",
  73.       "_type" : "news",
  74.       "_id" : "4FEY1T6-RMOmOJYts4FoAQ",
  75.       "_score" : 0.024621923,
  76.       "fields" : {
  77.         "content" : "美联社报道,中国将于今天访问俄罗斯的北部地区。",
  78.         "author" : "张三",
  79.         "title" : "美国访问俄罗斯",
  80.         "category" : "政治",
  81.         "publish_date" : "2010/07/11"
  82.       },
  83.       "highlight" : {
  84.         "content" : [ "美联社报道,<tag2>中国</tag2>将于今天访问俄罗斯的北部地区。" ]
  85.       },
  86.       "sort" : [ 1278806400000, 0.024621923 ]
  87.     }, {
  88.       "_index" : "test",
  89.       "_type" : "news",
  90.       "_id" : "lL-8BzCNTT2yEkqs1Owc_A",
  91.       "_score" : 0.61871845,
  92.       "fields" : {
  93.         "content" : "美国国务卿希拉里对记者说,韩国首尔江南区的大部分富豪都有移居朝鲜的意愿。",
  94.         "author" : "李四",
  95.         "title" : "中国经济将面临下滑危险",
  96.         "category" : "经济",
  97.         "publish_date" : "2010/07/12"
  98.       },
  99.       "highlight" : {
  100.         "title" : [ "<tag2>中国</tag2>经济将面临下滑危险" ]
  101.       },
  102.       "sort" : [ 1278892800000, 0.61871845 ]
  103.     }, {
  104.       "_index" : "test",
  105.       "_type" : "news",
  106.       "_id" : "DNB6gTpSRaOexC1axCpZ0Q",
  107.       "_score" : 0.048311904,
  108.       "fields" : {
  109.         "content" : "中国国务院总理谈到国内体育,金牌无疑是最重要的,美国",
  110.         "author" : "张三",
  111.         "title" : "美国体育的举国体制",
  112.         "category" : "体育",
  113.         "publish_date" : "2010/07/14"
  114.       },
  115.       "highlight" : {
  116.         "content" : [ "<tag2>中国</tag2>国务院总理谈到国内体育,金牌无疑是最重要的,美国" ]
  117.       },
  118.       "sort" : [ 1279065600000, 0.048311904 ]
  119.     }, {
  120.       "_index" : "test",
  121.       "_type" : "news",
  122.       "_id" : "4lH55yoAQVe7cARIYVfYnQ",
  123.       "_score" : 0.048311904,
  124.       "fields" : {
  125.         "content" : "中国对东南亚海域的军事威胁将持续,俄罗斯严密关注事态发展",
  126.         "author" : "张三",
  127.         "title" : "各国大力发展教育事业",
  128.         "category" : "政治",
  129.         "publish_date" : "2010/07/15"
  130.       },
  131.       "highlight" : {
  132.         "content" : [ "<tag2>中国</tag2>对东南亚海域的军事威胁将持续,俄罗斯严密关注事态发展" ]
  133.       },
  134.       "sort" : [ 1279152000000, 0.048311904 ]
  135.     }, {
  136.       "_index" : "test",
  137.       "_type" : "news",
  138.       "_id" : "hFovoBdCTI-2ErYAQV-AKg",
  139.       "_score" : 0.12422675,
  140.       "fields" : {
  141.         "content" : "中国经济反弹乏力,美国经济持续低迷,其他经济体也靠不住",
  142.         "author" : "李四",
  143.         "title" : "欧洲债务危机席卷全球",
  144.         "category" : "经济",
  145.         "publish_date" : "2010/07/19"
  146.       },
  147.       "highlight" : {
  148.         "content" : [ "<tag2>中国</tag2>经济反弹乏力,美国经济持续低迷,其他经济体也靠不住" ]
  149.       },
  150.       "sort" : [ 1279497600000, 0.12422675 ]
  151.     } ]
  152.   },
  153.   "facets" : {
  154.     "cate" : {
  155.       "_type" : "terms",
  156.       "missing" : 0,
  157.       "total" : 10,
  158.       "other" : 0,
  159.       "terms" : [ {
  160.         "term" : "政治",
  161.         "count" : 4
  162.       }, {
  163.         "term" : "经济",
  164.         "count" : 3
  165.       }, {
  166.         "term" : "体育",
  167.         "count" : 3
  168.       } ]
  169.     }
  170.   }
  171. }
复制代码


  结果包含了需要的几个部分。值得注意的是,facet的统计是命中的结果进行统计,filter是对结果进行过滤,filter不会影响facet,如果要统计filter掉的的就要使用filter facet。

  ES提供了非常多的功能,JSON的组合比一般的SQL这样的语法要凌乱,但是通过组合能够满足各种复杂的应用,很多影响性能的设置也值得好好去看。对开发者而已,利用好内置API接口进行二次开发也非常必要,比如开发自己的分词,和其他库的同步等。ES现在还在0.19.9 但是已经出现了很多官方的培训,所以前途应该不可限量,未来可能会是检索系统解决方案的首选。

elasticsearch学习入门