伙计们,
我们想做一个中间有空格的 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>
使用通配符搜索时,不会调用查询的分析阶段。这意味着"请帮助*"不会通过带状疱疹过滤器等,因此不会给出任何命中。
如您的问题评论中所述 - 在索引阶段改用 EdgeNgramFilter ,然后只需将您的查询作为"请帮助"提交。然后,这将检索该字段以"请帮助"开头的所有文档,因为它将创建同一令牌的多个版本(例如"P","Pl","Ple","Ple","Please","Please H"等)。
您必须调整过滤器的顺序以匹配您的需求。
您还可以使用 KeywordTokenizer 将完整的输入作为单个标记编制索引(如果需要,可以使用小写筛选器),然后使用它将单个标记与通配符搜索进行匹配(因为不需要进行其他分析)。