對於使用 elasticsearch 來講,強力建議去先讀相關文檔. 理解一些概念,便於後面實際中使用。這裏先推薦一些連接html
Getting Started 官方開始文檔docker
官方全部文檔目錄django
像查看 查詢日誌,須要配置elasticsearch, 具體能夠參看 官方文檔 show log數據結構
注意,若是是用docker 啓動 elasticsearch,日誌默認沒有輸出到文檔,默認被終端接收。可使用 docker logs -f dockerelk_elasticsearch_1 查看, 這裏查看的是 elasticsearch 的訪問日誌,查詢日誌跟索引日誌查不到!!!app
在使用 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來實現了相關業務。
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 對中文支持不好。指定搜索字段時,當查詢值是數字型字符串,或者英文字符,都能準備匹配到。 可是若是查詢值是兩個以上的漢子時,就不能搜索出內容