博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
elasticsearch 爬坑记
阅读量:7235 次
发布时间:2019-06-29

本文共 2066 字,大约阅读时间需要 6 分钟。

前言

对于使用 elasticsearch 来说,强力建议去先读相关文档. 理解一些概念,便于后面实际中使用。这里先推荐一些链接

爬坑

日志

像查看 查询日志,需要配置elasticsearch, 具体可以参看 官方文档

注意,如果是用docker 启动 elasticsearch,日志默认没有输出到文档,默认被终端接收。可以使用 docker logs -f dockerelk_elasticsearch_1 查看, 这里查看的是 elasticsearch 的访问日志,查询日志跟索引日志查不到!!!

search_phase_execution_exception

在使用 django-rest-elasticsearch 进行查询时,出现 400 错误, log 如下:

elasticsearch.exceptions.RequestError: TransportError(400, 'search_phase_execution_exception', 'failed to create query: {n "multi_match" : {n "query" : "root",n "fields" : [n "description^1.0",n "name^1.0",n "sex^1.0",n "tel^1.0"n ],n "type" : "best_fields",n "operator" : "OR",n "slop" : 0,n "prefix_length" : 0,n "max_expansions" : 50,n "minimum_should_match" : "75%",n "lenient" : false,n "zero_terms_query" : "NONE",n "boost" : 1.0n }n}')

2017-06-19 11:15:37,054 [Thread-7:123145454583808] [django.server:131] [base [ERROR]- "GET /elk/search_users?search=root HTTP/1.1" 500 171266

日志里的查询代码不太好看,我重新打印下查询代码:

GET /user/_index{  "sort": "_doc",  "query": {    "multi_match": {      "minimum_should_match": "75%",      "query": "root",      "fields": [        "name",        "tel",        "sex",        "description"      ]    }  }}

通过跟踪调试,multi_match 时,fields不支持不同类型一起查询。 这里 fields 基本是string, sex,跟 age都是整型。当在查询字段中去掉这两个整型字段就不再出错了

这里 查询api是 /elk/search_users?search=root, 要查询的内容一定是 ?search=内容

关联查询

一般业务需要在查询返回信息时需要将相关连信息一起返回,而定义简单的数据结构需要更多后续来实现功能。 这里我借助django来实现了相关业务。

requirement
  • Django REST framework

  • Django REST Elasticsearch

在 models中如果遇到关联关系的字段,使用自带的相应字(如:ForeignKey), 然后需要在 每个app下创建自己的serializers 的文件,然后搜索的Serializer引用这些serializer类就行

class ElasticCourseSerializer(ElasticModelSerializer):    enterprise = EnterpriseSerializer()    category = CategorySerializer()    image = serializers.SerializerMethodField(read_only=True)    class Meta:        model = VideoInfo        es_model = CourseIndex        fields = ('pk', 'title', 'description', 'image', 'sign_num', 'create_time', 'enterprise', 'category')

这样就能返回关联信息了

中文分词

在使用filter查询时,发现elasticsearch 对中文支持很差。指定搜索字段时,当查询值是数字型字符串,或者英文字符,都能准备匹配到。 但是如果查询值是两个以上的汉子时,就不能搜索出内容

转载地址:http://cagfm.baihongyu.com/

你可能感兴趣的文章
异常检测——局部异常因子(Local Outlier Factor ,LOF)算法
查看>>
记录一次广州白云区项目数据库连接失败问题的解决过程
查看>>
干货:Vue粒子特效(vue-particles插件)
查看>>
Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象...
查看>>
加密PDF为只读模式
查看>>
让你编写的控件库在 XAML 中有一个统一的漂亮的命名空间(xmlns)和命名空间前缀...
查看>>
MySQL数据库的锁详解【转】
查看>>
ip route 解释
查看>>
【转】Android中保持Service的存活
查看>>
Consul功能简介
查看>>
IdentityServer4实战 - API与IdentityServer的交互过程解析
查看>>
Delphi编程 -- 使用CPUID指令获取CPU信息(转自大富翁)
查看>>
Android setRequestedOrientation用法
查看>>
面向对象三大基本特性,五大基本原则
查看>>
更改窗口图标并将其显示在任务栏
查看>>
包含的语句
查看>>
正则表达式-匹配标点符号
查看>>
osworkflow descriptor 解析 重要概念
查看>>
Edmonds_Karp 算法 (转)
查看>>
第一节 接口概述 [转贴]
查看>>