技术水平已经好久没有在进步了,我一直在琢磨为什么,归根到底就是意志力不够坚强!遇到问题的时候没有自己去思考怎么解决,而是一味的百度找答案,一旦找不到答案就放弃了,这样的我怎么会进步呢!
这次的开发,对我来说算是一个比较五脏俱全的项目,虽小但是功能确很强悍!采用了ElasticSearch分布式全文搜索引擎,那么这是个什么东西呢?
看一下百科介绍:
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
简单来说,它能让你检索数据的能力变得十分强悍!来说说如何部署 Elasticsearch 环境(要先安装JDK1.8这个我就不多说了)。
下载下面三个文件并全部解压到某盘的根目录(比如:D:/):
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.0.0-windows-x86_64.zip https://artifacts.elastic.co/downloads/kibana/kibana-7.0.1-windows-x86_64.zip https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.2.0/elasticsearch-analysis-ik-7.2.0.zip
将 kibana-7.0.1-windows-x86_64 拖到 elasticsearch-7.0.0-windows-x86_64 目录下
将 elasticsearch-analysis-ik-7.2.0 拖到 elasticsearch-7.0.0-windows-x86_64/plugin 目录下
启动 elasticsearch-7.0.0-windows-x86_64\bin 目录下的 elasticsearch.bat
再启动 elasticsearch-7.0.0-windows-x86_64\kibana-7.0.1-windows-x86_64\bin 目录下的 kibana.bat
此时 Elasticsearch 环境就启动好了!你可以访问 http://127.0.0.1:9200 看看是否成功。
由于本项目的语言采用的是Python,所以在百度搜索了Python操作Elasticsearch的一些资料,归根到底还是CRUD:
首先得有一个对象:
es = Elasticsearch(["http://127.0.0.1:9200"]),
创建索引:
es.indices.create(index=‘sadness‘,ignore)
插入数据:
es.index(index="sadness",doc_type="doc",id=1,body={"name":"zhanshan","timestamp":datetime.now()})
Get获取数据:
res = es.get(index=‘indexName‘, doc_type=‘typeName‘, id=‘idValue‘)
删除数据:
es.delete(index=‘indexName‘, doc_type=‘typeName‘, id=‘idValue‘)
条件删除:
query = {‘query‘: {‘match‘: {‘sex‘: ‘famale‘}}} es.delete_by_query(index=‘indexName‘, body=query, doc_type=‘typeName‘)
批量写入、删除、更新:
doc = [ {"index": {}}, {‘name‘: ‘jackaaa‘, ‘age‘: 2000, ‘sex‘: ‘female‘, ‘address‘: u‘北京‘}, {"index": {}}, {‘name‘: ‘jackbbb‘, ‘age‘: 3000, ‘sex‘: ‘male‘, ‘address‘: u‘上海‘}, {"index": {}}, {‘name‘: ‘jackccc‘, ‘age‘: 4000, ‘sex‘: ‘female‘, ‘address‘: u‘广州‘}, {"index": {}}, {‘name‘: ‘jackddd‘, ‘age‘: 1000, ‘sex‘: ‘male‘, ‘address‘: u‘深圳‘}, ] doc = [ {‘index‘: {‘_index‘: ‘indexName‘, ‘_type‘: ‘typeName‘, ‘_id‘: ‘idValue‘}} {‘name‘: ‘jack‘, ‘sex‘: ‘male‘, ‘age‘: 10 } {‘delete‘: {‘_index‘: ‘indexName‘, ‘_type‘: ‘typeName‘, ‘_id‘: ‘idValue‘}} {"create": {‘_index‘ : ‘indexName‘, "_type" : ‘typeName‘, ‘_id‘: ‘idValue‘}} {‘name‘: ‘lucy‘, ‘sex‘: ‘female‘, ‘age‘: 20 } {‘update‘: {‘_index‘: ‘indexName‘, ‘_type‘: ‘typeName‘, ‘_id‘: ‘idValue‘}} {‘doc‘: {‘age‘: ‘100‘}} ] es.bulk(index=‘indexName‘, doc_type=‘typeName‘, body=doc)
搜索所有数据:
es.search(index="my_index",doc_type="test_type") 或者 body = { "query":{ "match_all":{} } } es.search(index="my_index",doc_type="test_type",body=body)
term查询:
body = { "query":{ "term":{ "name":"python" } } } # 查询name="python"的所有数据 es.search(index="my_index",doc_type="test_type",body=body)
terms查询:
body = { "query":{ "terms":{ "name":[ "python","android" ] } } } # 搜索出name="python"或name="android"的所有数据 es.search(index="my_index",doc_type="test_type",body=body)
match与multi_match:
# match:匹配name包含python关键字的数据 body = { "query":{ "match":{ "name":"python" } } } # 查询name包含python关键字的数据 es.search(index="my_index",doc_type="test_type",body=body) # multi_match:在name和addr里匹配包含深圳关键字的数据 body = { "query":{ "multi_match":{ "query":"深圳", "fields":["name","addr"] } } } # 查询name和addr包含"深圳"关键字的数据 es.search(index="my_index",doc_type="test_type",body=body)
ids:
body = { "query":{ "ids":{ "type":"test_type", "values":[ "1","2" ] } } } # 搜索出id为1或2d的所有数据 es.search(index="my_index",doc_type="test_type",body=body)
复合查询bool:
bool有3类查询关系,must(都满足),should(其中一个满足),must_not(都不满足)
body = { "query":{ "bool":{ "must":[ { "term":{ "name":"python" } }, { "term":{ "age":18 } } ] } } } # 获取name="python"并且age=18的所有数据 es.search(index="my_index",doc_type="test_type",body=body)
切片式查询:
body = { "query":{ "match_all":{} } "from":2 # 从第二条数据开始 "size":4 # 获取4条数据 } # 从第2条数据开始,获取4条数据 es.search(index="my_index",doc_type="test_type",body=body)
范围查询:
body = { "query":{ "range":{ "age":{ "gte":18, # >=18 "lte":30 # <=30 } } } } # 查询18<=age<=30的所有数据 es.search(index="my_index",doc_type="test_type",body=body)
前缀查询:
body = { "query":{ "prefix":{ "name":"p" } } } # 查询前缀为"赵"的所有数据 es.search(index="my_index",doc_type="test_type",body=body)
通配符查询:
body = { "query":{ "wildcard":{ "name":"*id" } } } # 查询name以id为后缀的所有数据 es.search(index="my_index",doc_type="test_type",body=body)
以上就是Python对Elasticsearch的基本操作了,我的项目就是采用了上面的部分代码。
项目预览:http://www.iqiyi.com/w_19saegbh6x.html
项目地址:https://github.com/BlackXu007/CrawlerEngine
参考文章:https://blog.csdn.net/u013429010/article/details/81746179
原文地址:https://www.cnblogs.com/blackxu/p/11219451.html