使用弹性搜索查询DSL,这就是我目前正在构建查询的方式:
elastic_sort = [
{ "timestamp": {"order": "desc" }},
"_score",
{ "name": { "order": "desc" }},
{ "channel": { "order": "desc" }},
]
elastic_query = {
"fuzzy_like_this" : {
"fields" : [ "msgs.channel", "msgs.msg", "msgs.name" ],
"like_text" : search_string,
"max_query_terms" : 10,
"fuzziness": 0.7,
}
}
res = self.es.search(index="chat", body={
"from" : from_result, "size" : results_per_page,
"track_scores": True,
"query": elastic_query,
"sort": elastic_sort,
})
我一直试图实施过滤器或分析器,以便包含"#"在搜索中(我希望搜索" #thing"返回包含"#thing"的结果),但我很快就会出现。我收到的错误消息没有帮助,只是告诉我我的查询格式不正确。
我试图合并此处找到的方法:http://www.fullscale.co/blog/2013/03/04/preserving_specific_characters_during_tokenizing_in_elasticsearch.html但它在上下文中对我没有任何意义。
有没有人知道如何做到这一点?
答案 0 :(得分:1)
您是否为索引创建了映射?您可以在映射中指定不分析某些字段。
例如,推文映射可以是:
"tweet": {
"properties": {
"id": {
"type": "long"
},
"msg": {
"type": "string"
},
"hashtags": {
"type": "string",
"index": "not_analyzed"
}
}
}
然后,您可以对“hashtags”执行术语查询,以获得精确的字符串匹配,包括“#”字符。
如果您希望“hashtags”也被标记化,您可以随时为“hashtags”创建一个多字段。