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编程中的包结构
Oct 25 Python
Python中的descriptor描述器简明使用指南
Jun 02 Python
浅谈Python 集合(set)类型的操作——并交差
Jun 30 Python
利用python实现命令行有道词典的方法示例
Jan 31 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
Apr 21 Python
Python绘制KS曲线的实现方法
Aug 13 Python
Python Requests库基本用法示例
Aug 20 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
Feb 26 Python
Python join()函数原理及使用方法
Nov 14 Python
Python爬虫之Selenium实现关闭浏览器
Dec 04 Python
Python爬虫之App爬虫视频下载的实现
Dec 08 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
Mar 04 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的access操作类
2008/04/09 PHP
php 显示指定路径下的图片
2009/10/29 PHP
ajax 的post方法实例(带循环)
2011/07/04 PHP
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
PHP字符串word末字符实现大小写互换的方法
2014/11/10 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
2016/12/14 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
2020/07/24 PHP
繁简字转换功能
2006/07/19 Javascript
js 强制弹出窗口代码研究-又一款代码
2010/03/20 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
javascript获取flash版本号的方法
2014/11/20 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
2020/04/09 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
[39:46]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第二场 11.25
2020/11/25 DOTA
python定时采集摄像头图像上传ftp服务器功能实现
2013/12/23 Python
Python实现抢购IPhone手机
2018/02/07 Python
使用python实现BLAST
2018/02/12 Python
python绘制趋势图的示例
2020/09/17 Python
python 下载m3u8视频的示例代码
2020/11/11 Python
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
上班上网检讨书
2014/01/29 职场文书
残疾人创业典型事迹
2014/02/01 职场文书
女娲补天教学反思
2014/02/05 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
初中新生军训方案
2014/05/13 职场文书
环保标语口号
2014/06/13 职场文书
文明城市创建标语
2014/06/16 职场文书
汽修专业自荐信
2014/07/07 职场文书
酒店财务经理岗位职责
2015/04/08 职场文书
公司年会主持词范文!
2019/05/07 职场文书
《语言的突破》读后感3篇
2019/12/12 职场文书
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android