2011-12-15 9 views
7

所以我在Solr很新,但我试图使用PatternReplaceCharFilterFactory对将要存储的电话号码字符串进行一些预处理。下面是该领域的配置:Solr PatternReplaceCharFilterFactory不会替换指定的模式

<fieldType name="phone_number" class="solr.TextField" > 
    <analyzer> 
    <charFilter class="solr.PatternReplaceCharFilterFactory" 
       pattern="\(?(\d{3})?\)?[-. ]?(\d{3})[-. ]?(\d{4})" 
       replaceWith="$1-$2-$3"/> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    </analyzer> 
</fieldType> 

我已经测试了正则表达式和它匹配的一切,我会期待它(例如555.444.1234,(555)444-1234,5554441234,4441234,444-1234。等)。

现在我的理解是,正则表达式应匹配传递给它的任何东西,并用指定的模式替换它。所以如果他们通过我555.123.4444我期望它导致555-123-4444被传递给StandardTokenizerFactory。从那里它将被分解成代币555,123,4444。

考虑到我花了多少时间,我确信有一个小的配置问题,我错过了,但从可用文档(我见过),我不知道它是什么。

预先感谢您。

+0

也许你可以添加一些细节到你的问题(编辑它),使其对其他用户更有用。你甚至可以自动接受你的答案。 – javanna

+0

@javanna,它实际上不会让我自动接受我的答案2天或我会。我不确定我是否想编辑或回答。我解决了答案,一旦等待期结束我会接受 – Jared

+0

太好了,谢谢! – javanna

回答

6

行,所以我想通了一个更“幸运”的谷歌搜索我碰到这个链接Solr filters: PatternReplaceCharFilter并在最底层来了,他们商量,我想解释高级参数后更好的过滤器实际上是如何工作的:

CharFilter对单个字符进行操作,并且模式匹配需要内部缓冲区来读取更多字符。 MaxBlockChars允许您指定缓冲区的大小。

我的问题是它读取的是单个字符而不是整个字符串。这与我看到的例子相反。所以解决方案是在我的charFilter我添加了MaxBlockChar属性,并说它工作。在LucidImagination的网站和solr wiki上我没有提到这个属性(我遇到过)。

+0

有趣的是,当我试图将它添加到过滤器节点时,我得到了'Unknown parameters:{maxBlockChars = 10000}。 –

+0

@TimBezhashvyly这是为了3.1版本,如果我记得,它可能会改变,因为它们在版本6上 – Jared