我是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,因为我需要识别电子邮件地址。 是否可以以这种方式使用空格执行正则表达式搜索?
有人可以建议我为实现这些正则表达式命中需要做些什么改变吗?
答案 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"/>
对同一文本使用多个字段是一种非常强大的技术。它允许使用不同的匹配技术对同一文本进行多个视图。您可以在同一索引中使用经过轻度处理的文本(标记化,小写)进行模糊匹配,词干文本和语音文本。