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 strip()函数 介绍
May 24 Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
Mar 30 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
Aug 08 Python
Python算法输出1-9数组形成的结果为100的所有运算式
Nov 03 Python
Pycharm 实现下一个文件引用另外一个文件的方法
Jan 17 Python
python网络应用开发知识点浅析
May 28 Python
PyQt5中向单元格添加控件的方法示例
Mar 24 Python
Python startswith()和endswith() 方法原理解析
Apr 28 Python
如何利用python进行时间序列分析
Aug 04 Python
python 多线程爬取壁纸网站的示例
Feb 20 Python
Python实现老照片修复之上色小技巧
Oct 16 Python
对象析构函数__del__在Python中何时使用
Mar 22 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
解析thinkphp的左右值无限分类
2013/06/20 PHP
php多线程实现方法及用法实例详解
2015/10/26 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
2016/02/03 PHP
JavaScript中的私有成员
2006/09/18 Javascript
js中几种去掉字串左右空格的方法
2006/12/25 Javascript
Ext JS Grid在IE6 下宽度的问题解决方法
2009/02/15 Javascript
js change,propertychange,input事件小议
2011/12/20 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
Bootstrap模态窗口源码解析
2017/02/08 Javascript
angularjs实现下拉列表的选中事件示例
2017/03/03 Javascript
DVA框架统一处理所有页面的loading状态
2017/08/25 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
Vue自定义指令封装节流函数的方法示例
2018/07/09 Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
2018/10/24 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
微信小程序系列之自定义顶部导航功能
2019/05/21 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
2019/06/27 Javascript
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
基于python3 OpenCV3实现静态图片人脸识别
2018/05/25 Python
python与C、C++混编的四种方式(小结)
2019/07/15 Python
python Web flask 视图内容和模板实现代码
2019/08/23 Python
keras tensorflow 实现在python下多进程运行
2020/02/06 Python
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
大学总结自我鉴定
2014/01/18 职场文书
建筑系毕业生自我鉴定
2014/01/24 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
付款证明模板
2015/06/19 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
《植树问题》教学反思
2016/03/03 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python
使用Ajax实现无刷新上传文件
2022/04/12 Javascript