自定义Solr搜索特定字段的方式



我想看看是否有可能自定义solr来改变它搜索特定字段的方式。

为了更好地理解上下文和问题,这是我想做的-我有5个字段,它们都将是文本字段[不要读太多的语法..)

<field>a</field> ==> will contain normal text [lazy fox jumps over ..]
<field>b</field> ==> will contain normal text [lazy fox jumps over ..]
<field>c</field> ==> will contain numbers separated by a delimiter [1, 2, 4, 6]
<field>d</field> ==> will contain numbers separated by a delimiter [1, 2, 4, 6]
<field>e</field> ==> will contain numbers separated by a delimiter [1, 2, 4, 6]

我的查询将搜索所有这5个字段和字段c, d &E也将包含以逗号分隔的数值。

在搜索时,我想在查询&索引中字段内的值。我怎么能做到呢?

=>查看问题的另一种方法是,如果查询字段中的一个值出现在索引中的字段中,那么我应该匹配这个文档以返回。这看起来像一个简单的"OR"搜索,但每个字段内的值可以在100的顺序…所以构造一个OR查询,许多可能的输入值不会很漂亮,我猜。如果这可以很好地扩展,那么这可能是一个可能的解决方案,但我不确定它是否可以很好地扩展。

如何实现这样的自定义?-搜索/查询性能是考虑的关键因素。

对于字段c d和e,您应该将这些值(通过分隔符)拆分为另一个多值字段。正如@Umar建议的那样。然后,您将拥有用于搜索数字的单个字段(让该字段称为"numbers")。

所以你的查询变成

q=a:(query) b:(query) numbers:(query)

假设默认查询操作符为OR。

字段"numbers"应该是字符串,如果你只是想简单的相等搜索。如果你想在这些数字上进行范围搜索,它应该是int。

如果您担心数字并不总是以可预测的格式(即来自用户输入),您可以选择将字段c到e的内容复制到单个文本字段中。这将给你一个更宽松的匹配能力,但你不能做范围搜索之类的。在IIRC中,SOLR的copy字段允许您为一个目标字段指定多个源字段而不会出现问题,但是当您加载文档时,目标字段将获得最后执行的copyField的内容。因此,这在这里不起作用,您需要在代码中将内容连接到单个字段。

对于字段c d和e,您应该通过分隔符分隔值,并将其存储为多值字段,这将允许您匹配每个单个值。

所以你的查询变成

q=a:(query) b:(query) c:(query) d:(query) e:(query)

假设默认查询操作符为OR。

您可以使用copyField选项。创建一些有名称的字段,例如"composite"。

<field name="composite" type="sometype" indexed="true" stored="false" multiValued="true">

设置存储选项false以避免过度使用内存。

与c d &e.复制一个c & &;e字段到'composite'

<copyField source="c" dest="composite">
<copyField source="d" dest="composite">
<copyField source="e" dest="composite">

那么你的查询将如下所示:

q=a:(query) AND composite:(query)

最新更新