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

axe*_*rod 1 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>
Run Code Online (Sandbox Code Playgroud)

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

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

当我的查询字符串是"about solr"时,我得到两个字段作为结果,虽然我只想要第一个,因为它是唯一包含所有字符(包括空格)的字符串.这不仅发生在空白区域,还与其他特殊字符如":"一起发生.用括号搜索(关于solr)没有用.

注意:在搜索之前我正在逃避我的字符串:

String s1 = ClientUtils.escapeQueryChars(s);
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Aru*_*run 5

这是Solr的预期行为.您将需要使用about AND solr来获得所需的行为.默认值为OR.如果要更改此行为,可以使用q.op = AND作为q.op参数,然后根据您的期望处理有关solr的内容.但是,将OR更改为AND并不是一个好主意,因为通常会假设OR,因此更改它不是一个好主意.而是将您的查询更改为AND.

标准分析器会在空格和特殊字符处打破您的短语.没有这样的列表,任何非字母数字字符都变成空格.

在此处阅读有关分析器的更多信息:http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters

更新: StandardTokenizerFactory中断的字符例如是&.,等等.这句话:"我和我的狗去散步.狗追了一只玩具松鼠." 将被分析为=>我的狗我去散步这只狗追逐一只玩具松鼠.

如果你想只在空白区域使用:WhitespaceTokenizerFactory

更新: WhitespaceTokenizerFactory中断的字符是空格和新行.所以这句话:"我和我的狗去散步.狗追了一只玩具松鼠." 将被分析为=> [Me] [&] [my] [Dog] [go] [for] [a] [walk.] [The] [dog] [chased] [a] [toy-squirrel.].