Solr 通配符搜索,中间有空格



伙计们,

我们想做一个中间有空格的 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 将完整的输入作为单个标记编制索引(如果需要,可以使用小写筛选器),然后使用它将单个标记与通配符搜索进行匹配(因为不需要进行其他分析)。

最新更新