Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用Solr时,如何使用包含空格的模式获得正则表达式命中率?_Regex_Solr - Fatal编程技术网

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

Regex 使用Solr时,如何使用包含空格的模式获得正则表达式命中率?,regex,solr,Regex,Solr,我是Solr的新手,在匹配可能包含空格的正则表达式搜索中遇到问题 一个例子是搜索带有区号的电话号码 我为以下字符串编制索引: 给我打电话:01234567890 在本例中,我的正则表达式是:/[0-9{5}?[0-9]{6}/ 这将创建url: http://localhost:8983/solr/core/select?q=content%3A%2F%28[0-9]{5}%29+%3F%28[0-9]{6}%29%2F&wt=xml&indent=true 但我没有得到任何点击 My sche

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

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

我为以下字符串编制索引:

给我打电话:01234567890

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

这将创建url:

http://localhost:8983/solr/core/select?q=content%3A%2F%28[0-9]{5}%29+%3F%28[0-9]{6}%29%2F&wt=xml&indent=true

但我没有得到任何点击

My 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是因为我需要标识电子邮件地址。 是否可以以这种方式使用空格执行正则表达式搜索


有人能告诉我需要做哪些更改才能达到这些正则表达式的点击率吗?

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

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

如果电话号码是一个常见的用例,那么创建一个字段类型,该字段类型将忽略除电话号码以外的所有内容。我为ISBNs做了类似的操作。最后一步是使用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"/>


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

谢谢你的回答,这让我更接近了。我尝试了你的第一个建议,不幸的是,现在我需要一个匹配整行的正则表达式。因此,在我上面概述的情况下,我会得到以下结果:/[a-z]*[0-9]{5}[0-9]{6}/但如果我使用,则没有任何结果:/[0-9]{5}[0-9]{6}/使用管理UI中的分析页面查看分析链中步骤的结果。这对于调试此类事情非常有用。