使用Solr时,如何使用包含空格的模式获取正则表达式命中?

时间:2013-09-26 14:08:55

标签: regex solr

我是Solr的新手,我遇到了匹配可能包含空格的正则表达式搜索问题。

一个例子是搜索带区号的电话号码。

我索引以下字符串:

致电01234 567890

在这个例子中我的正则表达式是:/ [0-9 {5}?[0-9] {6} /

创建网址:

的http://本地主机:8983 / solr的/核心/选择Q =含量%3A%2F%28 [0-9] {5}%29 +%3F%28 [0-9] {6}% 29%2F&安培;重量= XML&安培;缩进=真

但我没有得到任何点击。

我的schema.xml包含以下内容:

<fieldType name="general_text" class="solr.TextField" omitNorms="true" positionIncrementGap="100">
          <analyzer type="index">
          <tokenizer class="solr.UAX29URLEmailTokenizerFactory" />
          <filter class="solr.LowerCaseFilterFactory" /> 
          </analyzer>
        <analyzer type="query">
          <tokenizer class="solr.UAX29URLEmailTokenizerFactory" />              
          <filter class="solr.LowerCaseFilterFactory" /> 
        </analyzer>
      </fieldType>

<field name="content" type="general_text" indexed="true" stored="true" required="false" multiValued="true" />

我可能需要在索引数据后运行不同的正则表达式,所以我不认为在我的情况下使用PatternTokenizerFactory会起作用。我正在使用UAX29URLEmailTokenizerFactory,因为我需要识别电子邮件地址。 是否可以以这种方式使用空格执行正则表达式搜索?

有人可以建议我为实现这些正则表达式命中需要做些什么改变吗?

1 个答案:

答案 0 :(得分:0)

以下是一些方法。对于这两者,您可以定义新的字段类型和新字段,并使用copyField将“content”的文本发送到第二个字段。

一种方法是将文本复制到另一个不标记的字段。这将保留模式匹配的空间。使用字符串字段类型和关键字tokenizer(使整个输入成为单个关键字)。针对该字段运行正则表达式查询。

如果电话号码是常见用例,请创建一个忽略除电话号码之外的所有内容的字段类型。我为ISBN做了类似的事情。使用LengthFilterFactory的最后一步很重要,因为零长度令牌有一些奇怪的行为。

<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory"/>
<!-- Remove anything that isn’t a digit or an 'x'. -->
<filter class="solr.PatternReplaceFilterFactory"
    pattern="[^\dx]" replacement="" replace="all"/>
<!-- ISBNs and EANs are either 10 or 13 characters long. -->
<filter class="solr.LengthFilterFactory" min="10" max="13"/>

对同一文本使用多个字段是一种非常强大的技术。它允许使用不同的匹配技术对同一文本进行多个视图。您可以在同一索引中使用经过轻度处理的文本(标记化,小写)进行模糊匹配,词干文本和语音文本。