如何在 ElasticSearch 中使用特殊字符进行分词和搜索
how to tokenize and search with special characters in ElasticSearch
我需要将像 #tag1 quick brown fox #tag2 这样的文本标记化为 #tag1
、quick
、brown
、fox
、#tag2
,所以我可以在任何模式 #tag1
、quick
、brown
、fox
、#tag2
上搜索此文本其中符号 #
必须包含在搜索词中。在我的索引映射中,我有一个 text
类型字段(用于搜索 quick
、brown
、fox
)和 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] 搜索以 #
开头的模式=]查询类型。
我需要将像 #tag1 quick brown fox #tag2 这样的文本标记化为 #tag1
、quick
、brown
、fox
、#tag2
,所以我可以在任何模式 #tag1
、quick
、brown
、fox
、#tag2
上搜索此文本其中符号 #
必须包含在搜索词中。在我的索引映射中,我有一个 text
类型字段(用于搜索 quick
、brown
、fox
)和 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] 搜索以 #
开头的模式=]查询类型。