我正在寻找一种方法来分析字符串" abc123" as [" abc123"," 321cba"]。我查看了reverse
令牌过滤器,但这只会让我[" 321cba"]。关于此过滤器的文档非常稀疏,仅说明
"类型为
reverse
的令牌过滤器...只需反转每个令牌。"
我还使用了keyword_repeat
过滤器,这让我有两个实例。我不知道这是否有用,但现在所有它都会反转这两个实例。
如何使用reverse
令牌过滤器,同时保留原始令牌?
我的分析器:
{ "settings" : { "analysis" : {
"analyzer" : {
"phone" : {
"type" : "custom"
,"char_filter" : ["strip_non_numeric"]
,"tokenizer" : "keyword"
,"filter" : ["standard", "keyword_repeat", "reverse"]
}
}
,"char_filter" : {
"strip_non_numeric" : {
"type" : "pattern_replace"
,"pattern" : "[^0-9]"
,"replacement" : ""
}
}
}}}
答案 0 :(得分:0)
制作并放置一个分析器来反转一个字符串(比如reverse_analyzer)。
PUT index_name
{
"settings": {
"analysis": {
"analyzer": {
"reverse_analyzer": {
"type": "custom",
"char_filter": [
"strip_non_numeric"
],
"tokenizer": "keyword",
"filter": [
"standard",
"keyword_repeat",
"reverse"
]
}
},
"char_filter": {
"strip_non_numeric": {
"type": "pattern_replace",
"pattern": "[^0-9]",
"replacement": ""
}
}
}
}
}
然后,对于一个字段,(比如phoneno),使用mapping as,(为手机创建一个类型并附加映射)
PUT index_name/type_name/_mapping
{
"type_name": {
"properties": {
"phone_no": {
"type": "string",
"fields": {
"reverse": {
"type": "string",
"analyzer": "reverse_analyzer"
}
}
}
}
}
}
所以,phone_no就像是multifield,它会存储一个字符串,反之亦然, 如果你索引
phone_no: 911220
然后在elasticsearch中,会有字段为,
phone_no: 911220 and phone_no.reverse : 022119
,因此您可以搜索,过滤反向或非反转字段。
希望这会有所帮助。
答案 1 :(得分:0)
我不相信你可以直接这样做,因为我不知道如何让反向令牌过滤器同时输出原件。
但是,您可以使用fields参数同时索引原始和反转,无需额外编码。然后,您将搜索这两个字段。
所以,让我们说你的领域叫做phone_number:
"phone_number": {
"type": "string",
"fields": {
"reverse": { "type": "string", "index": "phone" }
}
}
在这种情况下,我们使用默认分析仪(假设标准)进行索引,并使用您的客户分析仪电话进行反向索引。然后,您可以针对这两个字段发出查询。
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/_multi_fields.html
答案 2 :(得分:0)
我不确定是否可以使用内置的令牌过滤器来完成此操作。我建议你创建自己的plugin。弹性搜索团队支持ICU Analysis plugin,您可以将其作为示例使用。
答案 3 :(得分:0)
我在分析仪中使用以下两个char_filter。这是对正则表达式的丑陋滥用,但似乎有效。它仅限于前20个数字字符,但在我的用例中是可以接受的。
首先它对所有数字字符进行分组,然后使用自己的(仅限数字!)反向显式重建字符串。然后,替换模式中心的空间会使标记生成器将其拆分为两个标记 - 原始标记和反向标记。
,"char_filter" : {
"strip_non_numeric" : {
"type" : "pattern_replace"
,"pattern" : "[^0-9]"
,"replacement" : ""
}
,"dupe_and_reverse" : {
"type" : "pattern_replace"
,"pattern" : "([0-9]?)([0-9]?)([0-9]?)([0-9]?)([0-9]?)([0-9]?)([0-9]?)([0-9]?)([0-9]?)([0-9]?)([0-9]?)([0-9]?)([0-9]?)([0-9]?)([0-9]?)([0-9]?)([0-9]?)([0-9]?)([0-9]?)([0-9]?)"
,"replacement" : "$1$2$3$4$5$6$7$8$9$10$11$12$13$14$15$16$17$18$19$20 $20$19$18$17$16$15$14$13$12$11$10$9$8$7$6$5$4$3$2$1"
}
}