2011-04-28 77 views
3

我正在尝试查看是否可以自定义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的顺序..所以构建一个或许查询许多可能的输入值不会是我猜。如果这能够很好地扩展,那么这可能是一个可能的解决方案,但不确定它是否能够很好地扩展。

我该如何实现这样的定制? - 搜索/查询性能是一个将要考虑的关键因素。

回答

0

对于字段c d和e,您应该用分隔符分隔值,并将其存储为多值字段,这样可以使您匹配每个单个值。

所以你的查询变得

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

假设默认查询运算符是OR。

+0

默认查询运算符仅适用于字段之间的正确吗?即,在a,b,c,d和e之间。 你能指定一个默认的查询操作符跨越不同的字段和每个字段吗? - 另一种方法是设置默认值为OR,并在查询中明确指定AND。 – karthik 2011-04-29 16:45:16

+0

不,默认的操作符将在任何空格分隔的条件下工作,除非我们通过用引号括起来使它们成为短语。 – Umar 2011-04-30 07:54:45

-1

您可以使用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) 
+0

你只能使用copyField一个源到一个目标。你提议的并不多。 – harschware 2011-04-29 13:53:17

+1

上面的copyField的使用是正确的,solr允许将所需字段复制到单个目标字段中。如果你甚至检查了这个例子,你可以在默认模式文件中看到使用文本作为复制字段。尽管需要注意的一点是目标字段被定义为多值字段。 – Umar 2011-05-04 08:43:11

0

的领域çd和e,你应该(用分隔符)的值分裂成另外多值字段。正如@Umar所言。然后,您将有一个字段用于搜索数字(让该字段被称为“数字”)。

所以你的查询变得

Q =一:(查询)B:(查询)编号:(查询)

假设默认查询运算符是OR。

如果你只是想简单的平等搜索,字段“数字”应该是字符串。如果你想允许范围搜索这些数字,它应该是int。

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

+0

问题是我无法将所有这些值合并到一个字段中。他们就像访问控制,每个领域都有重要意义,即使其中一个领域不匹配,我也不应该匹配文档。这是一个与这些不同的领域。 – karthik 2011-04-29 16:48:04

+0

然后只为所有人使用文本字段,并在字段之间使用AND和OR。简单。将任何字段查询与parens分组。例如。 (a:(query)AND b:(query))OR(c:(query)or d:(q1 AND q2))或你想象的任何逻辑表达式。 – harschware 2011-04-29 17:04:17

+0

谢谢你的建议,会试试看。当我们在每个领域有成千上万的项目时,会有怎样的表现会有什么线索? 有没有办法编写一个自定义搜索组件,可以在Solr中以有效的方式执行此操作。通过上述方法,我们增加了大量的查询条件,这将适用于系统中的每一个搜索,所以我有点担心这个设计将如何执行。 – karthik 2011-05-02 14:16:58