Indexing SOLR:如何在字段值中使用通配符和问号
在过去的几天里,我已经阅读了很多页面,但可以找到针对以下情况配置字段分析器的任何示例:Indexing SOLR:如何在字段值中使用通配符和问号,indexing,solr,wildcard,Indexing,Solr,Wildcard,在过去的几天里,我已经阅读了很多页面,但可以找到针对以下情况配置字段分析器的任何示例: -字段值可以同时包含这两个值?和*: abcdef1 ab?de?2 abc?e* -查询也可能包含它: “ab??e*”和“ab*”——因此应解决所有文件 “ab1*”-仅秒。 可以这样配置SOLR吗?在这种情况下,您可能需要创建字段类型并将其应用于字段 您的字段类型应该包括这样的标记器和过滤器,它们将生成标记 您可以在solr wiki页面上的use tokenizer and filter上阅读更多内容
-字段值可以同时包含这两个值?和*:
abcdef1李>
“ab??e*”和“ab*”——因此应解决所有文件李>
可以这样配置SOLR吗?在这种情况下,您可能需要创建字段类型并将其应用于字段 您的字段类型应该包括这样的标记器和过滤器,它们将生成标记 您可以在solr wiki页面上的use tokenizer and filter上阅读更多内容 您还可以使用不同的分析器进行索引和查询 这也取决于您的要求 我建议你试试下面的字段类型 您可以在schema.xml中添加以下字段类型。 对要执行部分/通配符搜索的字段使用“部分搜索”字段类型 完成schema.xml更改后,需要重新启动服务器并重新索引数据
<fieldType name="partial_search" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="10"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>
</fieldType>
在这种情况下,您可能需要创建字段类型并将其应用于字段 您的字段类型应该包括这样的标记器和过滤器,它们将生成标记 您可以在solr wiki页面上的use tokenizer and filter上阅读更多内容 您还可以使用不同的分析器进行索引和查询 这也取决于您的要求 我建议你试试下面的字段类型 您可以在schema.xml中添加以下字段类型。 对要执行部分/通配符搜索的字段使用“部分搜索”字段类型 完成schema.xml更改后,需要重新启动服务器并重新索引数据
<fieldType name="partial_search" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="10"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>
</fieldType>
请重新格式化问题正文。很难理解。好的,现在应该更清楚了。请重新格式化问题正文。很难理解。好吧,现在应该更清楚了。不允许使用多个标记器,所以应该如下:
无论如何,您的方法很好,涵盖了很多变体,除以下内容外:字段=ab?de?2
和查询=ab1*
。还有一个:field=ab*
和query=ab1234
。我认为ab?de?2是不可能实现的。。。由于您无法创建任何此类标记…您仍然可以从您的终端尝试…我建议使用ngram,您可以实现部分或通配符搜索…当您有一个类似“abhijit”的文本时…然后使用上述字段类型,您将创建标记,如ab、abh、abhi、abhij、abhijit、abhijit、bh、bhi、,bhij…等等,如果你查询..bhi..,那么你应该得到abhijit的结果…也许可以使用FuzzySearch?但据我所知,它可以替换所需术语中的任何字符,因此如果我们得到字段ab?de?2
和查询zbcdef2
,它可以匹配它们,但这是错误的。。。如果可以将FuzzySearch配置为仅从两侧(字段和查询)在?
上启动,则可以解决我的问题。一般来说,我所有的数据都有固定的长度(15个字符),所以我可以用尾随的?
标记替换所有*
。您认为如何?不允许使用多个标记器,因此应该如下所示:
无论如何,您的方法很好,涵盖了很多变体,除了以下内容:field=ab?de?2
和query=ab1*
。还有一个:field=ab*
和query=ab1234
。我认为ab?de?2是不可能实现的。。。由于您无法创建任何此类标记…您仍然可以从您的终端尝试…我建议使用ngram,您可以实现部分或通配符搜索…当您有一个类似“abhijit”的文本时…然后使用上述字段类型,您将创建标记,如ab、abh、abhi、abhij、abhijit、abhijit、bh、bhi、,bhij…等等,如果你查询..bhi..,那么你应该得到abhijit的结果…也许可以使用FuzzySearch?但据我所知,它可以替换所需术语中的任何字符,因此如果我们得到字段ab?de?2
和查询zbcdef2
,它可以匹配它们,但这是错误的。。。如果可以将FuzzySearch配置为仅从两侧(字段和查询)在?
上启动,则可以解决我的问题。一般来说,我所有的数据都有固定的长度(15个字符),所以我可以用尾随的?
标记替换所有*
。你觉得怎么样?