我有一个文本字段,其定义如下:
<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)
有什么建议?
这是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.].
| 归档时间: |
|
| 查看次数: |
1914 次 |
| 最近记录: |