如何索引字符串及其反转?

时间:2014-08-01 22:37:56

标签: filter elasticsearch token

我正在寻找一种方法来分析字符串" abc123" as [" abc123"," 321cba"]。我查看了reverse令牌过滤器,但这只会让我[" 321cba"]。关于此过滤器的文档非常稀疏,仅说明

  

"类型为reverse的令牌过滤器...只需反转每个令牌。"

(见http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-reverse-tokenfilter.html)。

我还使用了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" : ""
        }
    }
}}}

4 个答案:

答案 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"
    }
}