简单的利用elasticsearch进行关键字搜索的例子
ElasticSearch概述
- 分布式实时文件存储,可将每一个字段存入索引,使其可以被检索到。
- 实时分析的分布式搜索引擎。分布式:索引分拆成多个分片,每个分片可有零个或多个副本。集群中的每个数据节点都可承载一个或多个分片,并且协调和处理各种操作;负载再平衡和路由在大多数情况下自动完成。
- 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。也可以运行在单台PC上。
- 支持插件机制,分词插件、同步插件、Hadoop插件、可视化插件等。
总体方案
- 使用同一个elasticsearch库进行Faq(文档)检索和管理
- 检索
- 需要一个检索脚本。功能是将用户query放入curl查询语句中。curl请求后再进行回包解析。判断检索的第一位文档得分是否低于阈值,是则加入检索库;否则返回文档结果。
- 管理
- 需要一个管理脚本。功能包括查询索引,增加索引,删除索引,查询文档,增加文档,更改文档,删除文档。
- 如何设置阈值
- 建立测试索引,增加一批文档。
- 编写一批与库中已有文档均不相似的测试用例,使用测试用例进行检索。
- 编写脚本统计检索出的第一位文档的得分。
- 根据得分设置阈值,低于该阈值加入检索库中。
运行ElasticSearch
- 解压elasticsearch压缩包到任意目录temp_path。 tar -zxvf elasticsearch_6.2.4.tar.gz -C temp_path
- 运行elasticsearch。 temp_path/elasticsearch/bin/elasticsearch -d
-
检查是否已运行,访问9200端口,若出现elasticsearch欢迎界面则成功运行。 curl http://localhost:9200/?pretty
索引操作
-
索引介绍 索引(index)是将若干个分区进行分组的逻辑空间,也就是文档存储的地址。 es中使用index API使数据可以被存储并检索。以下为索引的meta字段。
meta data 解释 index 文档存储的地方 type 文档代表的对象的类 id 文档的唯一标识 -
查询所有索引的情况 curl ‘localhost:9200/_cat/indices?v’
- 新建Faq库索引,索引名称为faq
curl -XPUT 'localhost:9200/faq?pretty' -H "Content-Type: application/json" -d'{ "settings" : { "index": { "analysis" : { "analyzer" : { "seg_analyzer" : { "tokenizer" : "ik_max_word", "filter": "unique" } } } } }, "mappings": { "faq": { "properties": { "faq_id": { "type": "long" }, "standard_query": { "type": "text", "analyzer": "seg_analyzer", "search_analyzer": "ik_smart" } } } } }'
- 单次往faq索引插入一条文档,文档的type也为faq,id为1
curl -XPOST 'localhost:9200/faq/faq/1?pretty' -H "Content-Type: application/json" -d'{ "faq_id":1, "standard_query":"什么是固定汇率" }'
-
获取文档 curl -XGET ‘localhost:9200/faq/faq/1?pretty’
- 批量索引操作 一次添加两个faq文档
curl -XPOST 'localhost:9200/faq/faq/_bulk?pretty' -H "Content-Type:application/json" -d' {"index":{"_id":"2"}} {"faq_id": 2,"standard_query":"什么是逆回购"} {"index":{"_id":"3"}} {"faq_id": 3,"standard_query":"存款保险制度详解"} '
查询操作
- 查询faq索引,name字段包含“逆回购”的文档,输出结果按_score值进行排序
curl -XPOST 'localhost:9200/faq/_search?pretty' -H "Content-Type: application/json" -d'{ "query": { "match": { "standard_query":"逆回购" } } }'
- 查看返回的首文档,根据_score值判断是否加入检索库。
删除操作
- 删除单个文档
curl -XDELETE 'localhost:9200/faq/faq/1?pretty'
- 删除整个索引(慎重)
curl -XDELETE 'localhost:9200/faq?pretty'