禁用手机号码的sol搜索
Disable solr search on mobile number
我有一个名为 verbatim 的 solr 字段,其中包含句子和手机号码。我正在逐字使用 text_general 数据类型。
要求是逐字字段不能在手机号码上搜索(格式 XXX-XXX-XXXX)。
以下是我的想法。
发送到solr之前,对phone数字进行模式匹配,将数字替换为“”,然后正常索引。但这意味着我们正在修改内容。而且由于记录数以百万计,在 java 中对每条记录执行此操作可能会导致额外的时间消耗。
允许将数据发送到Solr,并使用schema.xml中的模式过滤器进行字段定义(text_general_vision)以识别phone数字,如以下。但我仍然可以使用 XXX 或 XXX-XXX-XXXX 进行搜索。任何帮助确定问题的帮助都将受到赞赏。提前致谢。
<fieldType name="text_general_vision" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.PatternReplaceFilterFactory" pattern="\d{3}-\d{3}-\d{4}" replacement="" replace="all" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="\d{3}-\d{3}-\d{4}" replacement="" replace="all" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
问题是您提供的过滤器 运行 在 标记化之后。这意味着它永远不会看到完整的 phone 数字,因为当用 -
.
分隔时,它会被 StandardTokenizer 分成单独的标记
您可以 apply a PatternReplaceCharFilter before tokenization happens,这将允许您删除与正则表达式匹配的任何模式。
请记住,您仍将对每条记录执行此操作(因为您必须对每条记录或每个查询执行此操作 - 记录通常少于查询的数量,但 YMMV) ,但逻辑发生在 Solr 端,而不是必须始终更新每个索引方法。
请记住,如果字段已存储,phone 号码仍然可用,但这似乎不是问题。
我有一个名为 verbatim 的 solr 字段,其中包含句子和手机号码。我正在逐字使用 text_general 数据类型。
要求是逐字字段不能在手机号码上搜索(格式 XXX-XXX-XXXX)。 以下是我的想法。
发送到solr之前,对phone数字进行模式匹配,将数字替换为“”,然后正常索引。但这意味着我们正在修改内容。而且由于记录数以百万计,在 java 中对每条记录执行此操作可能会导致额外的时间消耗。
允许将数据发送到Solr,并使用schema.xml中的模式过滤器进行字段定义(text_general_vision)以识别phone数字,如以下。但我仍然可以使用 XXX 或 XXX-XXX-XXXX 进行搜索。任何帮助确定问题的帮助都将受到赞赏。提前致谢。
<fieldType name="text_general_vision" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <filter class="solr.PatternReplaceFilterFactory" pattern="\d{3}-\d{3}-\d{4}" replacement="" replace="all" /> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> <filter class="solr.PatternReplaceFilterFactory" pattern="\d{3}-\d{3}-\d{4}" replacement="" replace="all" /> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>
问题是您提供的过滤器 运行 在 标记化之后。这意味着它永远不会看到完整的 phone 数字,因为当用 -
.
您可以 apply a PatternReplaceCharFilter before tokenization happens,这将允许您删除与正则表达式匹配的任何模式。
请记住,您仍将对每条记录执行此操作(因为您必须对每条记录或每个查询执行此操作 - 记录通常少于查询的数量,但 YMMV) ,但逻辑发生在 Solr 端,而不是必须始终更新每个索引方法。
请记住,如果字段已存储,phone 号码仍然可用,但这似乎不是问题。