如何在 ElasticSearch 中使用特殊字符进行分词和搜索

how to tokenize and search with special characters in ElasticSearch

我需要将像 #tag1 quick brown fox #tag2 这样的文本标记化为 #tag1quickbrownfox#tag2,所以我可以在任何模式 #tag1quickbrownfox#tag2 上搜索此文本其中符号 # 必须包含在搜索词中。在我的索引映射中,我有一个 text 类型字段(用于搜索 quickbrownfox)和 keyword 类型子字段(用于搜索 #tag),当我使用搜索词 #tag 时,它只给出了第一个标记 #tag1 上的匹配项,而不是 #tag1 上的匹配项。 我认为我需要的是一个分词器,它可以生成包含特殊字符的词边界分词。有人可以提出解决方案吗?

如果您想在搜索中包含 #,您应该使用与 standard analyzer 不同的分析器,因为 # 将在分析阶段被删除。您可以使用 whitespace analyzer 来分析您的文本字段。 同样对于搜索,您可以使用通配符模式:

查询:

GET [Your index name]/_search
{
  "query": {
    "match": {
      "[FieldName]": "#tag*"
    }
  }
}

您可以找到有关 Elastic 内置分析器的信息 here

更新:

空白分析器:

POST /_analyze
{
  "analyzer": "whitespace",
  "text": "#tag1 quick #tag2"
}

结果:

{
  "tokens" : [
    {
      "token" : "#tag1",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "quick",
      "start_offset" : 6,
      "end_offset" : 11,
      "type" : "word",
      "position" : 1
    },
    {
      "token" : "#tag2",
      "start_offset" : 12,
      "end_offset" : 17,
      "type" : "word",
      "position" : 2
    }
  ]
}

如您所见,#tag1 和#tag2 是两个标记。

感谢@Kaveh 的建议,我发现了我的错误。我的自定义分析器(带有很多过滤器等)使用的是标准分词器,我认为它类似于空白分词器。在我的自定义分析器中切换到空白分词器后,我可以看到分析器不再从单词的开头去除 #,并且我可以使用 [=12] 搜索以 # 开头的模式=]查询类型。