标准分析器,不会标记某些单词/模式

时间:2013-03-14 20:35:49

标签: lucene elasticsearch tokenize

所以,如果假设有这样的一行:

> Mar 14 20:22:41 subdomain.mydomain.colo postfix/smtpd[16862]: NOQUEUE:
> reject: RCPT from unknown[1.2.3.4]: 450 4.7.1 Client host rejected:
> cannot find your reverse hostname, [5.6.7.8]; from=<erp@misms.net.in>
> to=<a@domain1.com> proto=ESMTP helo=<a.domain.net> also
> from=<>

使用标准标记器时几乎没有问题。

  • 如果我有标准的tokenizer,我就无法搜索from=<>
  • 要做到这一点,空格标记器可以完美地工作。但是,与此同时,我将无法搜索emailid a@domain1.com或域a.domain.net,因为它们包含<>个字符。我希望a@domain1.com成为一个标记
  • 如果我使用标准的tokenizer,我可以搜索a@domain1.com,但这些实际上是两个令牌(所以我觉得效率很低)。
  • 标准tokenizer会破坏我不想要的主机名subdomain.mydomain.colo。

那么,有没有办法分析文本,使得它使用标准的标记化器,但也没有标记化与正则表达式匹配的单词?我是ES的新手,所以如果可能的话,请尝试给出一个小例子,那将是非常棒的。

我觉得正则表达式相关的标记器可能很昂贵所以如果有变化我可以做空白分析器+同时保留令牌,如主机名,电子邮件,并保留很少的单词,那将是非常棒的。

请回答您的任何输入。

PS:我查看了这个post in ES mailing列表,但它无法用于电子邮件地址或主机名,因为我无法列出所有电子邮件地址/主机名的详尽列表。所以,我希望你理解我的要求。

2 个答案:

答案 0 :(得分:2)

Lucene 4.X中的StandardAnalyzer发生了一些重大变化。它现在实现了UAX#29

,而不是旧的逻辑

旧式的StandardAnalyzer已经重命名为ClassicAnalyzer,它使用ClassicTokenizer,它应该可以完成你想要的大部分工作(它被明确设计为将电子邮件收件人和主机名作为单个令牌处理)。

但是,我认为它不会帮助您解析from=<>作为令牌。为此,我看到了几个选项:

  • 更改数据:由于它是您想要识别的非常具体的字符串,只需使用您可以轻松识别的单个令牌替换它的所有实例,例如将from=<>替换为NULLSENDER,然后索引它。
  • 创建自定义标记生成器来处理语法。可能最简单的方法,也就是Lucene API推荐的方法,就是复制ClassicTokenizer代码,并从那里开始工作。

考虑到你想要处理的特殊情况的简单明了,我可能会使用第一个选项,因为它应该非常简单,第二个选项可能比它的价值更麻烦。

答案 1 :(得分:0)

我认为使用不同的分析器添加多映射可以通过创建单独的案例来处理不同的场景来简化它:

    "myfield": {
            "type": "multi_field",
            "fields": {
                "myfield": {
                    "include_in_all": true,
                    "type": "string",
                    "index": "analyzed",
                    "analyzer": "myWhitespaceAnalyzer"
                },
                "variant1": {
                     "include_in_all": true,
                    "type": "string",
                    "index": "analyzed",
                    "analyzer": "myOtherAnalyzer"
                },
                 "untouched": {
                     "include_in_all": true,
                    "type": "string",
                    "index": "not_analyzed"
                }
            }
        }

根据您的需要搜索所有字段或特定字段。