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中用Ctrl+C终止多线程程序的问题解决
Mar 30 Python
Python 变量类型及命名规则介绍
Jun 08 Python
在Django框架中编写Context处理器的方法
Jul 20 Python
python中装饰器级连的使用方法示例
Sep 29 Python
python Celery定时任务的示例
Mar 13 Python
Python正则表达式实现简易计算器功能示例
May 07 Python
python制作朋友圈九宫格图片
Nov 03 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
Apr 08 Python
如何理解python面向对象编程
Jun 01 Python
python实现mask矩阵示例(根据列表所给元素)
Jul 30 Python
Python爬虫实现selenium处理iframe作用域问题
Jan 27 Python
python 中的jieba分词库
Nov 23 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下用cookie统计用户访问网页次数的代码
2010/05/09 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
php随机取mysql记录方法小结
2014/12/27 PHP
php筛选不存在的图片资源
2015/04/28 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
PHP实现递归目录的5种方法
2016/10/27 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
解javascript 混淆加密收藏
2009/01/16 Javascript
jquery实现智能感知连接外网搜索
2013/05/21 Javascript
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
2014/01/14 Javascript
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
2017/01/19 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
创建Vue项目以及引入Iview的方法示例
2018/12/03 Javascript
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
2019/05/14 jQuery
vue通信方式EventBus的实现代码详解
2019/06/10 Javascript
Python对象体系深入分析
2014/10/28 Python
python的keyword模块用法实例分析
2015/06/30 Python
Python使用bs4获取58同城城市分类的方法
2015/07/08 Python
Python找出9个连续的空闲端口
2016/02/01 Python
对python多线程与global变量详解
2018/11/09 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
Python实现快速大文件比较代码解析
2020/09/04 Python
HTML5中Localstorage的使用教程
2015/07/09 HTML / CSS
编写类String的构造函数、析构函数和赋值函数
2012/05/29 面试题
应届毕业生求职信范文分享
2013/12/26 职场文书
校本教研工作制度
2014/01/22 职场文书
学习决心书范文
2014/03/11 职场文书
毕业生如何写自荐信
2014/03/26 职场文书
丧事主持词大全
2014/04/02 职场文书
信息与计算机科学职业规划范文:成为一艘有方向的船
2014/09/11 职场文书
财务工作个人总结
2015/02/27 职场文书
小升初自荐信范文
2015/03/05 职场文书
学校食堂食品安全承诺书
2015/04/29 职场文书
祝福语集锦:给妹妹结婚的祝福语
2019/12/18 职场文书