我正在尝试查看是否可以自定义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和amp;的值。 e还将包含用逗号分隔的数值。
在搜索时,我想在查询中的值与...之间执行交集。索引中字段内的值。我怎样才能做到这一点?
=&GT;查看问题的另一种方法是,如果查询字段中的某个值出现在索引中的字段中,那么我应该匹配此文档以返回。这看起来像一个简单的“OR”搜索,但每个字段中的值可能是100的顺序..所以构建一个OR查询,许多可能的输入值不会是我猜的。如果这可以很好地扩展,那么这可能是一个可能的解决方案,但不确定它是否能很好地扩展。
如何实现这样的自定义? - 搜索/查询性能是一个将被考虑的关键因素。
答案 0 :(得分:0)
对于字段c d和e,您应该使用分隔符拆分值,并将其存储为多值字段,这样您就可以匹配每个单独的值。
所以您的查询变为
q=a:(query) b:(query) c:(query) d:(query) e:(query)
假设默认查询运算符是OR。
答案 1 :(得分:0)
对于字段c d和e,您应该将值(通过分隔符)拆分为另一个多值字段。正如@Umar建议的那样。然后,您将有一个用于搜索数字的字段(将此字段称为“数字”)。
所以您的查询变为
q = a :(查询)b :(查询)数字:(查询)
假设默认查询运算符是OR。
如果您只想进行简单的相等搜索,则字段“numbers”应为字符串。如果你想允许范围搜索这些数字,它应该是int。
如果您担心数字不会始终采用可预测的格式(即来自用户输入),您可以选择将字段c的内容复制到单个文本字段中。这将为您提供更宽松的匹配功能,但您将无法进行范围搜索等。 IIRC,SOLR的复制字段允许您在没有抱怨的情况下为一个目标字段指定许多源字段,但是当您加载文档时,目标字段将获取最后执行的copyField的内容。所以这在这里不起作用,你需要将内容连接到代码中的单个字段。
答案 2 :(得分:-1)
您可以使用copyField选项。创建一些具有某些名称的字段,例如'composite'。
<field name="composite" type="sometype" indexed="true" stored="false" multiValued="true">
将存储选项设置为false以避免过多的内存使用。
与c d&amp;相同的类型即复制一个c&amp; e字段到'composite'
。
<copyField source="c" dest="composite">
<copyField source="d" dest="composite">
<copyField source="e" dest="composite">
然后您的查询将如下所示:
q=a:(query) AND composite:(query)