在solr字段中的PackageTag
<field name="PackageTag" type="text_en_splitting" indexed="true" stored="true" required="false" multiValued="true"/>
我有以下价值
"playing @@*"
现在我正在寻找“玩”,我在结果中得到了它 但是当我用@@ *搜索时,我没有。 它在单词分隔符中省略。
有没有办法可以让用户搜索其特殊的字符,但仍然使用字分隔?
答案 0 :(得分:1)
这里有两个问题:
执行以下操作:
<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特殊字符的列表,但你是否尝试在字符前用\
(反斜杠)转义?
如果这不起作用,您可能需要查看用于索引字段的Analyzer
。 StandardAnalyzer
可能会对您的特殊字符做一些有趣的事情,因此您可以考虑使用其他分析器或自己动手。
答案 2 :(得分:0)
您必须在protwords.txt文件中添加单词分隔符字符,然后应用在索引和查询时使用protwords的过滤器。 (例如solr.WordDelimiterFilterFactory
带有protected="protwords.txt"
参数。)
通过这种方式,它们将根据您的需要进行标记,而不会在查询时间内删除。