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 相关文章推荐
python3使用tkinter实现ui界面简单实例
Jan 10 Python
Python实现从订阅源下载图片的方法
Mar 11 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
Python中利用xpath解析HTML的方法
May 14 Python
python实现自动发送邮件
Jun 20 Python
python批量从es取数据的方法(文档数超过10000)
Dec 27 Python
python ipset管理 增删白名单的方法
Jan 14 Python
Python使用Shelve保存对象方法总结
Jan 28 Python
Python OpenCV 使用滑动条来调整函数参数的方法
Jul 08 Python
python中图像通道分离与合并实例
Jan 17 Python
Python文件操作及内置函数flush原理解析
Oct 13 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
Nov 24 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将数据库中所有内容生成静态html文档的代码
2010/04/12 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
9个经典的PHP代码片段分享
2014/12/18 PHP
thinkphp分页集成实例
2017/07/24 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
从零开始学习jQuery (十) jQueryUI常用功能实战
2011/02/23 Javascript
jquery交替变换颜色的三种方法 实例代码
2013/11/19 Javascript
实例讲解JS中数组Array的操作方法
2014/05/09 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
jquery简单倒计时实现方法
2015/12/18 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
2016/06/03 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
解析如何利用iframe标签以及js制作时钟
2016/12/08 Javascript
js中let和var定义变量的区别
2018/02/08 Javascript
js实现页面多个日期时间倒计时效果
2019/06/20 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
python开发游戏的前期准备
2019/05/05 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
Python 如何实现访问者模式
2020/07/28 Python
html5视频常用API接口的实战示例
2020/03/20 HTML / CSS
计算机专业应届毕业生自荐信
2013/09/26 职场文书
汽车技术服务与营销专业在籍生自荐信
2013/09/28 职场文书
珍惜资源的建议书
2014/08/26 职场文书
迎国庆横幅标语
2014/10/08 职场文书
依法行政工作汇报
2014/10/28 职场文书
聚众斗殴罪辩护词
2015/05/21 职场文书
对领导班子的意见和建议
2015/06/08 职场文书
小学班主任教育随笔
2015/08/15 职场文书
2016社区平安家庭事迹材料
2016/02/26 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
python异步的ASGI与Fast Api实现
2021/07/16 Python