弹性搜索:包括搜索结果中的#/ hashtags

时间:2015-03-18 22:13:57

标签: python elasticsearch

使用弹性搜索查询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但它在上下文中对我没有任何意义。

有没有人知道如何做到这一点?

1 个答案:

答案 0 :(得分:1)

您是否为索引创建了映射?您可以在映射中指定不分析某些字段。

例如,推文映射可以是:

"tweet": {
  "properties": {
    "id": {
      "type": "long"
    },
    "msg": {
      "type": "string"
    },
    "hashtags": {
      "type": "string",
      "index": "not_analyzed"
    }
  }
}

然后,您可以对“hashtags”执行术语查询,以获得精确的字符串匹配,包括“#”字符。

如果您希望“hashtags”也被标记化,您可以随时为“hashtags”创建一个多字段。