我想在我的网站上使用“自动完成”作为搜索引擎。
因此,我有一个名为 shortdesc 的字段,其定义如下:
<field name="shortdesc" type="text_de" indexed="true" stored="false" />
字段类型:
<fieldType name="text_de" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LengthFilterFactory" min="3" max="20"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_de.txt" format="snowball" enablePositionIncrements="true"/>
<filter class="solr.GermanNormalizationFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_de.txt" format="snowball" enablePositionIncrements="true"/>
<filter class="solr.GermanNormalizationFilterFactory"/>
</analyzer>
</fieldType>
所以,现在要进行自动完成,我需要一个额外的字段(field_autocomplete),我将在其中复制字段 shortdesc。该字段定义为(我不需要从该字段检索数据):
<field name="field_autocomplete" type="text_autocomplete" indexed="true" stored="false" multiValued="true" />
和类型定义:
<fieldType name="text_autocomplete" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_de.txt" enablePositionIncrements="true" />
<filter class="solr.GermanNormalizationFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.EnglishMinimalStemFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" enablePositionIncrements="true" />
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="25"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_de.txt" enablePositionIncrements="true" />
<filter class="solr.GermanNormalizationFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.EnglishMinimalStemFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
然后,复制该字段:
<copyField source="shortdesc" dest="field_autocomplete"/>
好的,那么,我的第一个问题:
- 索引时,字段 text_autocomplete 的所有内容都来自 shortdesc 的副本,这是否意味着字段 shortdesc 上的值被处理然后复制到 field_autocomplete ?在这种情况下,我不需要在 text_autocomplete 类型上应用过滤器,因为它们与 text_de 中的相同,并且源将附带已经应用的过滤器?这是正确的还是我必须为所有这些指定过滤器(对于我想要“捕获”的每个字段?
还有一个问题:
- 当我使用分析器时,如果我在字段 text_de 上引入一个属于停用词的词,则会应用过滤器并且该词没有出现: 但是当我在字段 text_autocomplete 上执行相同操作时,似乎该词就在那里并存储为术语,过滤器没有做任何事情......
任何人都可以给我一个关于这两件事变得疯狂的线索吗?