Solr - 不能查询特殊字符或数字

时间:2013-10-12 13:45:56

标签: solr

在solr字段中的PackageTag

<field name="PackageTag" type="text_en_splitting" indexed="true" stored="true" required="false" multiValued="true"/>

我有以下价值

"playing @@*"

现在我正在寻找“玩”,我在结果中得到了它 但是当我用@@ *搜索时,我没有。 它在单词分隔符中省略。

有没有办法可以让用户搜索其特殊的字符,但仍然使用字分隔?

3 个答案:

答案 0 :(得分:1)

这里有两个问题:

  • 首先,您必须在Solr中创建自己的fieldType,并将其配置为NOT用户“@”和“*”作为stopWords:
schema.xml中的

执行以下操作:

<types>
        <fieldType name="myTextFieldType" class="solr.TextField" positionIncrementGap="100">
            <analyzer type="index">
                <tokenizer class="solr.StandardTokenizerFactory" />
                <filter class="solr.StopFilterFactory" ignoreCase="true"
                    words="stopwords.txt" enablePositionIncrements="true" />
            </analyzer>
            <analyzer type="query">
                <tokenizer class="solr.StandardTokenizerFactory" />             
                <filter class="solr.StopFilterFactory" ignoreCase="true"
                    words="stopwords.txt" enablePositionIncrements="true" />
            </analyzer>
        </fieldType>
        </types>

然后必须将该fieldType用于“PackageTag”字段:

<field name="PackageTag" type="text_en_splitting"
  • 然后,在“conf”目录(schema.xml所在的目录)中,创建或编辑stopwords.txt文件并为其添加“@”和“*”。把它们放在那里,每一个字符在一行:

    @

    *

现在,由于“*”字符也是Lucene查询(通配符)的特殊字符,因此您需要在查询中对其进行转义。您可以通过将其替换为“*”来转义“\*”。像这样:

PackageTag:bla\*

搜索包含“bla *”的字段。

答案 1 :(得分:0)

我不记得Lucene特殊字符的列表,但你是否尝试在字符前用\(反斜杠)转义?

如果这不起作用,您可能需要查看用于索引字段的AnalyzerStandardAnalyzer可能会对您的特殊字符做一些有趣的事情,因此您可以考虑使用其他分析器或自己动手。

答案 2 :(得分:0)

您必须在protwords.txt文件中添加单词分隔符字符,然后应用在索引和查询时使用protwords的过滤器。 (例如solr.WordDelimiterFilterFactory带有protected="protwords.txt"参数。)

通过这种方式,它们将根据您的需要进行标记,而不会在查询时间内删除。