elasticsearch 爬坑记

前言

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

爬坑

日志

像查看 查询日志,须要配置elasticsearch, 具体能够参看 官方文档 show log数据结构

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

search_phase_execution_exception

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

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}')ide

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

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

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 对中文支持不好。指定搜索字段时,当查询值是数字型字符串,或者英文字符,都能准备匹配到。 可是若是查询值是两个以上的汉子时,就不能搜索出内容