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 對中文支持不好。指定搜索字段時,當查詢值是數字型字符串,或者英文字符,都能準備匹配到。 可是若是查詢值是兩個以上的漢子時,就不能搜索出內容

相關文章
相關標籤/搜索