python elasticsearch环境搭建详解


Posted in Python onSeptember 02, 2019

windows下载zip

linux下载tar

下载地址:https://www.elastic.co/downloads/elasticsearch

解压后运行:bin/elasticsearch (or bin\elasticsearch.bat on Windows)

检查是否成功:访问 http://localhost:9200

linux下不能以root用户运行,

普通用户运行报错:

java.nio.file.AccessDeniedException

原因:当前用户没有执行权限

解决方法: chown linux用户名 elasticsearch安装目录 -R

例如:chown ealsticsearch /data/wwwroot/elasticsearch-6.2.4 -R

PS:其他Java软件报.AccessDeniedException错误也可以同样方式解决,给 执行用户相应的目录权限即可

2|0代码实例

如下的代码实现类似链家网小区搜索功能。

从文件读取小区及地址信息写入es,然后通过小区所在城市code及搜索关键字 匹配到对应小区。

代码主要包含三部分内容:

1.创建索引

2.用bulk将批量数据存储到es

3.数据搜索

注意:

代码的es版本交低2.xx版本,高版本在创建的索引数据类型有所不同

#coding:utf8
from __future__ import unicode_literals
import os
import time
import config
from datetime import datetime
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk

class ElasticSearch():
  def __init__(self, index_name,index_type,ip ="127.0.0.1"):
    '''
    :param index_name: 索引名称
    :param index_type: 索引类型
    '''
    self.index_name =index_name
    self.index_type = index_type
    # 无用户名密码状态
    #self.es = Elasticsearch([ip])
    #用户名密码状态
    self.es = Elasticsearch([ip],http_auth=('elastic', 'password'),port=9200)
  def create_index(self,index_name="ftech360",index_type="community"):
    '''
    创建索引,创建索引名称为ott,类型为ott_type的索引
    :param ex: Elasticsearch对象
    :return:
    '''
    #创建映射
    _index_mappings = {
      "mappings": {
        self.index_type: {
          "properties": {
            "city_code": {
              "type": "string",
              # "index": "not_analyzed"
            },
            "name": {
              "type": "string",
              # "index": "not_analyzed"
            },
            "address": {
              "type": "string",
              # "index": "not_analyzed"
            }
          }
        }

      }
    }
    if self.es.indices.exists(index=self.index_name) is True:
      self.es.indices.delete(index=self.index_name)
    res = self.es.indices.create(index=self.index_name, body=_index_mappings)
    print res

  def build_data_dict(self):
    name_dict = {}
    with open(os.path.join(config.datamining_dir,'data_output','house_community.dat')) as f:
      for line in f:
        line_list = line.decode('utf-8').split('\t')
        community_code = line_list[6]
        name = line_list[7]
        city_code = line_list[0]
        name_dict[community_code] = (name,city_code)

    address_dict = {}
    with open(os.path.join(config.datamining_dir,'data_output','house_community_detail.dat')) as f:
      for line in f:
        line_list = line.decode('utf-8').split('\t')
        community_code = line_list[6]
        address = line_list[10]
        address_dict[community_code] = address

    return name_dict,address_dict

  def bulk_index_data(self,name_dict,address_dict):
    '''
    用bulk将批量数据存储到es
    :return:
    '''
    list_data = []
    for community_code, data in name_dict.items():
      tmp = {}
      tmp['code'] = community_code
      tmp['name'] = data[0]
      tmp['city_code'] = data[1]
      
      if community_code in address_dict:
        tmp['address'] = address_dict[community_code]
      else:
        tmp['address'] = ''

      list_data.append(tmp)
    ACTIONS = []
    for line in list_data:
      action = {
        "_index": self.index_name,
        "_type": self.index_type,
        "_id": line['code'], #_id 小区code
        "_source": {
          "city_code": line['city_code'],
          "name": line['name'],
          "address": line['address']
          }
      }
      ACTIONS.append(action)
      # 批量处理
    success, _ = bulk(self.es, ACTIONS, index=self.index_name, raise_on_error=True)
    #单条写入 单条写入速度很慢
    #self.es.index(index=self.index_name,doc_type="doc_type_test",body = action)

    print('Performed %d actions' % success)

  def delete_index_data(self,id):
    '''
    删除索引中的一条
    :param id:
    :return:
    '''
    res = self.es.delete(index=self.index_name, doc_type=self.index_type, id=id)
    print res

  def get_data_id(self,id):
    res = self.es.get(index=self.index_name, doc_type=self.index_type,id=id)
    # # 输出查询到的结果
    print res['_source']['city_code'], res['_id'], res['_source']['name'], res['_source']['address']

  def get_data_by_body(self, name, city_code):
    # doc = {'query': {'match_all': {}}}
    doc = {
      "query": {
        "bool":{
          "filter":{
            "term":{
            "city_code": city_code
            }
          },
          "must":{
            "multi_match": {
              "query": name,
              "type":"phrase_prefix",
              "fields": ['name^3', 'address'],
              "slop":1,
              
              }

          }
        }
      }
    }
    _searched = self.es.search(index=self.index_name, doc_type=self.index_type, body=doc)
    data = _searched['hits']['hits']
    return data
     

if __name__=='__main__':
  #数据插入es
  obj = ElasticSearch("ftech360","community")
  obj.create_index()
  name_dict, address_dict = obj.build_data_dict()
  obj.bulk_index_data(name_dict,address_dict)

  #从es读取数据
  obj2 = ElasticSearch("ftech360","community")
  obj2.get_data_by_body(u'保利','510100')

以上就是全部知识点内容,感谢大家的阅读和对三水点靠木的支持。

Python 相关文章推荐
Python实现微信公众平台自定义菜单实例
Mar 20 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
Jun 14 Python
Flask模拟实现CSRF攻击的方法
Jul 24 Python
python爬取盘搜的有效链接实现代码
Jul 20 Python
python实现美团订单推送到测试环境,提供便利操作示例
Aug 09 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
Oct 10 Python
python轮询机制控制led实例
May 03 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
Jul 03 Python
虚拟机下载python是否需要联网
Jul 27 Python
Matplotlib 折线图plot()所有用法详解
Jul 28 Python
解决Python3.8运行tornado项目报NotImplementedError错误
Sep 02 Python
PyMongo 查询数据的实现
Jun 28 Python
关于pymysql模块的使用以及代码详解
Sep 01 #Python
使用Python将字符串转换为格式化的日期时间字符串
Sep 01 #Python
Python 使用多属性来进行排序
Sep 01 #Python
详解一种用django_cache实现分布式锁的方式
Sep 01 #Python
python实现多进程通信实例分析
Sep 01 #Python
python输出带颜色字体实例方法
Sep 01 #Python
基于Django框架的权限组件rbac实例讲解
Aug 31 #Python
You might like
PHP源码之explode使用说明
2011/08/05 PHP
超小PHP小马小结(方便查找后门的朋友)
2012/05/05 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
PHP更安全的密码加密机制Bcrypt详解
2017/06/18 PHP
jQuery on()方法使用技巧详解
2015/04/16 Javascript
微信小程序 http请求详细介绍
2016/10/09 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
JS重载实现方法分析
2016/12/16 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
JavaScript监听手机物理返回键的两种解决方法
2017/08/14 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
vue自定义指令的创建和使用方法实例分析
2018/12/04 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
2019/04/17 Javascript
vue项目配置使用flow类型检查的步骤
2020/03/18 Javascript
vue iview 隐藏Table组件里的某一列操作
2020/11/13 Javascript
python机器学习理论与实战(五)支持向量机
2018/01/19 Python
使用Python自动化破解自定义字体混淆信息的方法实例
2019/02/13 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
解决django 新增加用户信息出现错误的问题
2019/07/28 Python
python 多进程队列数据处理详解
2019/12/23 Python
Python urllib2运行过程原理解析
2020/06/04 Python
python上selenium的弹框操作实现
2020/07/13 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
德国旅游网站:weg.de
2018/06/03 全球购物
《乌塔》教学反思
2014/02/17 职场文书
理工学院学生自我鉴定
2014/02/23 职场文书
找工作求职信
2014/07/07 职场文书
政府四风问题整改措施
2014/10/04 职场文书
社区务虚会发言材料
2014/10/20 职场文书
2014年社区党建工作汇报材料
2014/11/02 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书