我有一个定义如下的文本字段:
<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