前言
对于使用 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 对中文支持很差。指定搜索字段时,当查询值是数字型字符串,或者英文字符,都能准备匹配到。 但是如果查询值是两个以上的汉子时,就不能搜索出内容
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。