基于ElasticSearch的小型网络空间搜索引擎

Posted blackxu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于ElasticSearch的小型网络空间搜索引擎相关的知识,希望对你有一定的参考价值。

技术水平已经好久没有在进步了,我一直在琢磨为什么,归根到底就是意志力不够坚强!遇到问题的时候没有自己去思考怎么解决,而是一味的百度找答案,一旦找不到答案就放弃了,这样的我怎么会进步呢!

这次的开发,对我来说算是一个比较五脏俱全的项目,虽小但是功能确很强悍!采用了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

以上是关于基于ElasticSearch的小型网络空间搜索引擎的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch | 深入理解

elasticsearch 学习笔记-kibana

es 基于磁盘的shard分配参数

非一般的Elasticsearch索引机制

[2017-12-20]ElasticSearch 小记

ElasticSearch实战-BKD-Tree 多维空间树算法(范围查询算法)