如何按字段过滤文档?
现在我获取所有文档,其中字段包含以此字符串开头的单词。最好的结果是,如果有人回答如何从结果首先得到精确的开始,然后保持,就像最接近过滤器的排序一样。谢谢。
喜欢:
company_name:(max*) result : ['Min & Max', 'Maximum speed', 'Mirana max parrot']
但我希望它像:
company_name:(max*) result : ['Maximum speed', 'Min & Max', 'Mirana max parrot']
现在我有了文本字段的配置:
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" />
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.EnglishMinimalStemFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" />
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
答案 0 :(得分:0)
您必须使用string
字段(实现为StrField
)或TextField
KeywordTokenizer
作为标记器类。
这样做的原因是对令牌执行通配符匹配,并且当字符串被拆分为多个令牌时,每个令牌将与通配符匹配。 string
类将整个字符串保持为单个标记,而KeywordTokenizer保持相同 - 但使用KeywordTokenizer允许您指定其他过滤器来处理字符串,例如在存储标记之前小写字符串。
答案 1 :(得分:0)
如果您使用的是EdgeNGrams,则不需要在查询中提供*。你只需要提供你的前缀。此外,EdgeNGram应仅位于索引配置中,而不应位于查询中。目前,你基本上只用前三个字符匹配。。
我建议你修复这两件事并再试一次(重新加载,但不需要重新索引,因为索引管道没有改变)。