我试图将一个字段作为一个范围进行搜索。 确切地说,我在该领域的元素看起来像这样:
A-C
Sch-So
搜索Banana
(B在范围A-C中)可以返回第一个文档
并且搜索School
( Sch 在Sch-So中匹配)应该提供第二个文档。虽然Salat
不应返回上述任何内容。
为了使其更复杂,一个文档中可以有多个值和范围,因此以下也是可能的。
A, E-G
C, F, U
Sch-So, Pi-Re
这意味着,当搜索以A开头的任何内容或以E,F或G开头的任何内容时,应找到第一个词。
有可能达到这个目的吗?
答案 0 :(得分:1)
在索引文档之前,您必须对文档进行预处理,因为Solr无法匹配“香蕉”。到' a-c'。您应该从在索引时将令牌注入令牌流的自定义tokenizer开始。根据你的例子,这个标记器会注入一个'' b'和' c'进入术语' a-c'的标记流。
然后使用solr.EdgeNGramFilterFactory
分析器为查询字词配置字段。您可以控制过滤器将创建的n-gram(例如,从side="front"
,minGramSize="1"
和maxGramSize="3"
开始。这基本上会使搜索词变为“香蕉”。进入多个术语''' ba''禁止'禁止'
查询字词' school'将导致n-gram'' sc'' sch'因此,学校'匹配' sch'在索引中。
查询字词' salat'将导致n-gram',' sa' sal'因此,salat' 不匹配' sch'在索引中。