Solr在查询中处理空格和其他特殊标记,例如"OR"



我有一个定义如下的文本字段:

<fieldType name="myTextField" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.NGramFilterFactory" minGramSize="1"
maxGramSize="40"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>

现在,我有一个包含以下文本的字段:"嗨,这是一个关于solr的问题">

以及另一个包含此文本的字段:"aaa-solr-bbb">

当我的查询字符串是"about-solr"时,我会得到这两个字段,尽管我只想要第一个,因为它是唯一一个包含所有字符(包括空格)的字段。这种情况不仅发生在空白处,也发生在其他特殊字符中,如":"。搜索带括号的(关于solr)没有帮助。

注意:在搜索字符串之前,我正在转义它:

String s1 = ClientUtils.escapeQueryChars(s);

有什么建议吗?

这是Solr的预期行为。您需要使用aboutANDsolr来获得您想要的行为。默认值为OR。如果您想更改此行为,可以通过使用q.op参数作为q.op=AND来执行,那么将根据您的期望处理关于solr的。但是,将OR更改为AND不是一个好主意,因为通常认为OR是OR,所以更改它不是一个坏主意。相反,将查询更改为AND。

标准分析器将您的短语分成空白和特殊字符。没有这样的列表,任何非字母数字字符都会变成空白。

点击此处了解有关分析仪的更多信息:http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters

更新:StandardTokenizerFactory中断的字符有,例如&、.、-所以这句话:"我和我的狗去散步了。狗追了一只玩具松鼠。"将被分析为=>我的狗出去散步了。

如果你只想在空白处突破,请使用:WhitespaceTokenizerFactory

更新:WhitespaceTokenizerFactory中断的字符是空白和新行。因此,这句话:"我和我的狗去散步了。狗追了一只玩具松鼠。"将被分析为=>[我][我的][狗][去][走][走][狗][追][玩具松鼠。]。

您可以使用solr短语查询。您的查询syntex将看起来像:

String query = ""about solr"";

然后它将匹配您需要的字段。

您当前的查询被解释为:

String query = "about OR solr";

因此,它将匹配这两个字段,这背后的原因是针对solr查询解析器的默认操作符是"OR"。检查你的schema.xml文件,它有以下条目:

<solrQueryParser defaultOperator="OR"/>

希望这能消除你的疑虑。

有关更多详细信息,请参阅以下链接:

http://www.solrtutorial.com/solr-query-syntax.html

http://www.solrtutorial.com/schema-xml.html

相关内容

最新更新