民间,
我们想在中间用空格进行solr外卡搜索。
例如,如果我们搜索“请\帮助*”,那么它应该检索所有具有“请帮助”的文档,然后是具有“请”和“帮助”字样的文档。
如果我们搜索“请\帮助*”,那么只有“请帮助”的归还文件,并且不返回“请”和“帮助”等个别标记的搜索。
下面给出了我们用于索引和搜索的字段定义
<fieldType name="string_ci" class="solr.TextField" sortMissingLast="true" omitNorms="true">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.WordDelimiterFilterFactory"/>
<filter class="solr.LengthFilterFactory" min="2" max="100"/>
<filter class="solr.ShingleFilterFactory" maxShingleSize="2" outputUnigrams="true"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ShingleFilterFactory" maxShingleSize="2" outputUnigrams="true"/>
</analyzer>
</fieldType>
答案 0 :(得分:1)
当您使用通配符搜索时,不会调用查询的分析阶段。这意味着&#34;请帮助*&#34;不会通过Shingle过滤器等,因此不会给任何点击。
如您对问题的评论中所述 - 在索引阶段使用EdgeNgramFilter,然后只需提交您的查询为&#34;请帮助&#34;。然后,这将检索字段以字段开头的所有文档&#34;请帮助&#34;,因为它将创建相同标记的多个版本(例如&#34; P&#34;,&#34; Pl&#34 ;,&#34; Ple&#34;,&#34;辩护&#34;,&#34;请求&#34;,&#34;请&#34;,&#34;请&#34;,&# 34;请H&#34;等。)
您必须调整过滤器的顺序以符合您的需要。
您还可以使用KeywordTokenizer将完整输入索引为单个标记(如果需要,使用LowercaseFilter),然后使用它来匹配单个标记与通配符搜索(因为没有其他分析将需要发生。)