0

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

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

我索引以下字符串:

打电话给我 01234 567890

在这种情况下,我的正则表达式是: /[0-9{5} ?[0-9]{6}/

创建网址:

http://localhost:8983/solr/core/select?q=content%3A%2F%28[0-9]{5}%29+%3F%28[0-9]{6}%29%2F&wt =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 因为我需要识别电子邮件地址。是否可以以这种方式使用空格执行正则表达式搜索?

有人可以建议我为实现这些正则表达式命中需要进行哪些更改吗?

4

1 回答 1

0

这里有几种方法。对于这两者,您都定义了一个新的字段类型和一个新的字段,并使用 copyField 将“内容”的文本发送到第二个字段。

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

如果电话号码是一个常见的用例,请创建一个忽略除电话号码之外的所有内容的字段类型。我为 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"/>

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

于 2013-09-26T15:39:31.130 回答