Apache Solr 自动搜索 (*)
Apache Solr automatically search with (*)
晚上好,
当我搜索单词 "app" 时,它没有显示单词 "apple"。但是如果我搜索 "app*",它会显示 "apple" 和 "app"。我不想在搜索栏中写“*”。如果我只搜索 "app" 并且它显示 "apple" 和 "app",我该怎么做?
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.SynonymFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
我尝试添加 <filter class="solr.ReversedWildcardFilterFactory"/>
但是没用。
有人可以帮助我吗?
我使用 Apache Solr 6.4.1
抱歉我的英语不好。
使用EdgeNGramFilterFactory
EdgeNGramFilterFactory:
This filter generates edge n-gram tokens of sizes within the given range.
参数:
- minGramSize:(整数,默认为 1)最小克大小。
- maxGramSize:(整数,默认为 1)最大克大小。
示例:
如果我们使用 minGramSize = 1 和 maxGramSize = 4 那么
在:"four score"
要过滤的分词器:"four"、"score"
输出:"f"、"fo"、"fou"、"four"、"s"、"sc"、"sco"、"scor"
对于您的情况,您可以使用以下架构:
<fieldType name="text_ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="200"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.SynonymFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
并将您的 fieldType 更新为 text_ngram
例如
<field name="name" type="text_ngram" indexed="true" stored="false" multiValued="true"/>
注意:不要忘记重新加载核心和重新索引数据
晚上好,
当我搜索单词 "app" 时,它没有显示单词 "apple"。但是如果我搜索 "app*",它会显示 "apple" 和 "app"。我不想在搜索栏中写“*”。如果我只搜索 "app" 并且它显示 "apple" 和 "app",我该怎么做?
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.SynonymFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
我尝试添加 <filter class="solr.ReversedWildcardFilterFactory"/>
但是没用。
有人可以帮助我吗?
我使用 Apache Solr 6.4.1
抱歉我的英语不好。
使用EdgeNGramFilterFactory
EdgeNGramFilterFactory:
This filter generates edge n-gram tokens of sizes within the given range.
参数:
- minGramSize:(整数,默认为 1)最小克大小。
- maxGramSize:(整数,默认为 1)最大克大小。
示例:
如果我们使用 minGramSize = 1 和 maxGramSize = 4 那么
在:"four score"
要过滤的分词器:"four"、"score"
输出:"f"、"fo"、"fou"、"four"、"s"、"sc"、"sco"、"scor"
对于您的情况,您可以使用以下架构:
<fieldType name="text_ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="200"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.SynonymFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
并将您的 fieldType 更新为 text_ngram
例如
<field name="name" type="text_ngram" indexed="true" stored="false" multiValued="true"/>
注意:不要忘记重新加载核心和重新索引数据