在SOLR中搜索多个字段

时间:2011-08-29 22:42:05

标签: solr

我试图搜索2个字段,而不必在查询中指定字段名称。在我的schema.xml中,我添加了2个字段,这些字段对应于数据库表中的2列。

<field name="title" type="string" indexed="true" stored="true" required="true"/>
<field name="description" type="string" indexed="true" stored="true"/>

此外,我添加了第3个字段,我想将其用作&#34; copyField&#34;中的目的地;
以及&#34; defaultSearchField&#34;

<field name="combinedSearch" type="string" indexed="true" stored="true" multiValued="true"/>

<copyField source="*" dest="combinedSearch"/>

<uniqueKey>title</uniqueKey> 

<defaultSearchField>combinedSearch</defaultSearchField>

现在在Solr管理界面中,如果我输入一些标题,它将返回结果,但如果我输入一些描述,它将不会返回任何内容。 似乎只有第一个字段用于搜索。我是否以正确的方式使用copyField和defaultSearchField? 我重新启动了solr服务器并重新生成了索引。 感谢。

3 个答案:

答案 0 :(得分:2)

可能它以相同的结果结束,但是对于您的信息,我在schema.xml的末尾使用copyField(但我不认为,顺序是相关的)在以下语法中:

   <copyField source="title" dest="combinedSearch" />
   <copyField source="description" dest="combinedSearch" />

下:

<field name="combinedSearch" type="string"

如果type="text"是更好的选择取决于“字符串”的定义。如果您使用默认的fieldTypes,type="string"可能更适合您的情况,因为对于string,默认情况下没有分析,这意味着(可能)也没有令牌化。

//更新

另一种方法是使用(e)dsimax查询解析器而不是copyfields。在solrconfig.xml上,您可以指定默认搜索的所有字段,如下所示:

  <requestHandler name="/select" class="solr.SearchHandler" default="true">
    <!-- default values for query parameters can be specified, these
         will be overridden by parameters in the request
      -->
     <lst name="defaults">
       <str name="defType">edismax</str>
       <float name="tie">0.01</float>
       <bool name="tv">true</bool>
       <str name="qf">
             title^1 description^1
       </str>
     ...

答案 1 :(得分:1)

尝试将combinedSearch类型更改为text,然后重新生成索引。

答案 2 :(得分:0)

这是我接近它的方式。我没有使用*别名,而是定义了要复制到我的组合字段的字段。我还在我的正常字段(标题和描述)上将multiValued设置为false。我没有将字段定义为字符串,而是使用了“text_general” - 对于我的普通字段和组合字段都是如此。

此外,我在我的组合字段上设置了“stored = false”,因为我不需要返回该值,因为它仅用于搜索 - 至少在我的情况下。

<field name="title" type="text_general" indexed="true" stored="true" required="true" multiValued="false" />
<field name="description" type="text_general" indexed="true" stored="true" multiValued="false"/>

<field name="combinedSearch" type="text_general" indexed="true" stored="false" multiValued="true"/>
<copyField source="title" dest="combinedSearch"/>
<copyField source="description" dest="combinedSearch"/>

<uniqueKey>title</uniqueKey> 
<defaultSearchField>combinedSearch</defaultSearchField>