我有一个文本字段,其定义如下:
<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);
有什么建议吗?
答案 0 :(得分:5)
这是Solr的预期行为。您需要使用关于 AND solr 来获取所需的行为。默认值为OR。如果要更改此行为,可以使用q.op = AND作为q.op参数,然后根据您的预期处理 about solr 。但是,将OR更改为AND并不是一个好主意,因为通常会假设OR,因此更改它不是一个好主意。而是将您的查询更改为AND。
标准分析器会在空格和特殊字符处中断您的短语。没有这样的列表,任何非字母数字字符都变成空格。
在此处详细了解分析器:http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
更新:StandardTokenizerFactory中断的字符例如是&amp; ,. ,等等。这句话:“我和我的狗去散步。狗追了一只玩具松鼠。”将被分析为=&gt;我的狗去散步这条狗追了一只玩具松鼠。
如果您只想在空白区域使用:WhitespaceTokenizerFactory
更新: WhitespaceTokenizerFactory中断的字符是空格和新行。所以这句话:“我和我的狗去散步。狗追了一只玩具松鼠。”将被分析为=&gt; [我] [&amp;] [我的] [狗] [去] [为] [a] [走。] [[]] [狗] [追逐] [a] [玩具 - 松鼠。]。
答案 1 :(得分:2)
您可以使用solr短语查询。您的查询syntex将如下所示:
String query = "\"about solr\"";
然后它将匹配您需要的字段。
您当前的查询解释如下:
String query = "about OR solr";
因此它将匹配两个字段,这背后的共振是solr查询解析器默认操作符是“OR”。检查你的schema.xml文件,它有以下条目:
<solrQueryParser defaultOperator="OR"/>
希望这能清除你的怀疑。
有关详细信息,请参阅以下链接: