有很多链接详细说明了StrField和TextField之间的区别。还有链接解释说,即使字段已编入索引,它也不会被标记化并存储为单个关键字,可以通过Solr admin和CURL debugQuery选项的调试分析进行验证。
我无法理解的是通配符如何在StrFields上运行?例如,如果名称是" John Doe"我搜索" John *",我得到那场比赛。这意味着,在某个深处,可能存在Trie或Dictionary表示,允许使用部分字符串进行搜索。
我会假设通配符在TextFields上匹配,允许(Edge)NGramFilters等。
答案 0 :(得分:1)
我认为你有错误的方法 - 使用带有NGramFilter的TextField会允许在没有的情况下使用通配符命中,因为它们会生成大量的令牌:
foo => f, o, o, fo, oo, foo
仅搜索fo
将匹配现有令牌(或者如果您还要在查询中展开ngrams,请匹配f
,o
和fo
)。
在外卡搜索中(这可能不是今天的实际实现,但它解释了它是如何工作的),Lucene可以查看字段列表中的所有标记,从提供的前缀开始(因为这是排序列表),然后迭代可用值,直到达到不共享相同前缀的值。对字母数字值的范围查询将需要相同的功能。
这也是反向通配符过滤器有意义的原因 - 它为每个值添加了反向标记,允许您将*foo
转换为搜索oof*
。
由于任何通配符搜索都会消除分析阶段(它的真的难以理解对通配字符串的分析,并且它可能无法满足您对它的期望do),最终的结果是"只是"获取与前缀匹配的令牌范围。