需要查询具有空格的Solr查询数据

时间:2017-03-26 16:22:16

标签: solr lucene spring-data whitespace

我是solr的新手。我在solr中的数据类似于" name":" John Lewis" 。 查询形成的外观和搜索完美如 fq = name%3A +%22John + Lewis%22 这是在Solr控制台中形成的,效果很好。

我的要求是将来自我的Java图层的特定单词搜索为" JohnLewis" 。它必须与" John Lewis"在solr repo。

此搜索不仅限于名称字段(2个字和中间的空格)。 我还有其他一些细节,例如"现金奖励信用卡" ,它有4个字,用户会查询如" CashRewardCreditCards"

如果可以在schema.xml中使用solr中提供的任何解析器处理这个问题,有人可以帮我解决这个问题。

3 个答案:

答案 0 :(得分:1)

您需要创建自定义fieldType。

首先在solr模式中定义fieldType:

<fieldType name="word_concate" class="solr.TextField" indexed="true" stored="false">
    <analyzer>
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\s*" replacement=""/>
        <tokenizer class="solr.StandardTokenizerFactory"/>
    </analyzer>
</fieldType>

这里我们将fieldType命名为word_concate 我们使用了CharFilterFactories的solr.PatternReplaceCharFilterFactory

  

字符过滤器是预处理输入字符的组件。字符过滤器可以像令牌过滤器一样链接并放置在Tokenizer前面。 PatternReplaceCharFilterFactory过滤器使用正则表达式来替换或更改字符模式

模式:\s*表示零个或多个空格字符

其次使用word_concate创建一个字段作为类型:

<field name="cfname" type="word_concate"/>

将您的姓名字段复制到带有复制字段的cfname

<copyField source="name" dest="cfname"/>

第三次重新索引数据。

现在您可以查询:cfname:"JohnLewis"它将返回名称John Lewis

答案 1 :(得分:0)

假设您的输入是CamelCase,如图所示我将使用Solr的Word分隔符过滤器 使用分析器查询端的splitOnCaseChange参数作为起点。这将采用诸如CashRewardCreditCards之类的输入令牌并生成令牌现金奖励信用卡

另见:

https://cwiki.apache.org/confluence/display/solr/Filter+Descriptions#FilterDescriptions-WordDelimiterFilter

答案 2 :(得分:0)

查看WordDelimiterFilterFactory

它有splitOnCaseChange属性。如果您将其设置为1,JohnLewis将被编入索引为John Lewis。

您需要将其添加到查询分析器中。如果用户搜索JohnLewis,则搜索将被翻译为John Lewis。