【问题标题】:Searching multiple fields in SOLR在 SOLR 中搜索多个字段
【发布时间】:2011-11-06 09:37:51
【问题描述】:

我正在尝试搜索 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"/>

此外,我添加了第三个字段,我想将其用作“copyField”中的目标
也作为“defaultSearchField”

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

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

<uniqueKey>title</uniqueKey> 

<defaultSearchField>combinedSearch</defaultSearchField>

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

【问题讨论】:

  • 嗨,开发者,你现在是如何解决这个问题的?你能发布正确的答案吗?

标签: solr


【解决方案1】:

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

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

下一个:

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

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

//更新

替代复制字段的另一种方法是使用 (e)dsimax 查询解析器。在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>
     ...

【讨论】:

  • 你试过了吗?它在工作吗?我的意思是您可以将两个字段复制到一个字段中吗?就像你做了两个来源和一个目标?
  • @manurajhada >你试过了吗?它有效吗? 我的意思是你可以将两个字段复制到一个字段中吗?wiki.apache.org/solr/DisMaxQParserPlugin#qf_.28Query_Fields.29
【解决方案2】:

这就是我的处理方式。我没有使用 * 别名,而是定义了将哪些字段复制到我的组合字段。我还在我的正常字段(标题和描述)上将 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>

【讨论】:

  • 不需要将title和description设置为text_general,因为复制发生在分析之前。仅将字段 combineSearch 设置为 text_general 即可。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多