1

前言

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

爬坑

日志

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

注意,如果是用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] [basehttp:log_message] [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 对中文支持很差。指定搜索字段时,当查询值是数字型字符串,或者英文字符,都能准备匹配到。 但是如果查询值是两个以上的汉子时,就不能搜索出内容


mugbya
1.2k 声望41 粉丝

时间永远分岔,通往无数未来