Solr在查询中处理空格和其他特殊标签,如“OR”

时间:2013-12-22 20:15:02

标签: solr tokenize

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

<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);

有什么建议吗?

2 个答案:

答案 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"/>

希望这能清除你的怀疑。

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

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

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