在SOLR中搜索多个字段

发布于 2024-12-02 03:55:43 字数 780 浏览 1 评论 0原文

我正在尝试搜索 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 服务器并重新生成索引。 谢谢。

I am trying to search on 2 fields without having to specify a field name in the query. In my schema.xml I have added 2 fields that correspond to 2 columns in a database table.

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

In addition I added a 3rd field which I want to use as a destination in "copyField"
and also as the "defaultSearchField"

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

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

<uniqueKey>title</uniqueKey> 

<defaultSearchField>combinedSearch</defaultSearchField>

Now in the Solr Admin UI, if I enter some title it will return results but if I enter some description it won't return anything.
It seems only the first field is used for searching. Am I using copyField and defaultSearchField in the right way?
I've restarted the solr server and regenerated the index.
Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

流心雨 2024-12-09 03:55:43

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

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

next:

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

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

//update

另一种替代复制字段的方法是使用 (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>
     ...

Probably it ends in the same result, but for your information, i use copyField at the end of the schema.xml (but i dont think, the order is relevant) in the following syntax:

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

next:

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

If type="text" is the better choise depends on the definition of "string". If you are using default fieldTypes, type="string" could better for your case, because for string there is no analyzing per default, which means (probably) there is also no tokenyzing.

//update

An other way instead of copyfields is to use the (e)dsimax query parser. On solrconfig.xml you can specify all the field you like to search by default, like this:

  <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>
     ...
梦里寻她 2024-12-09 03:55:43

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

Try change your combinedSearch type to text and then regenerate the index.

信愁 2024-12-09 03:55:43

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

Here's how I approached it. Instead of using * alias, I defined which fields to copy to my combined field. I also sat multiValued to false on my normal fields (title and description). Instead of defining my fields as string, I used "text_general" - both for my normal fields and my combined field.

Furthermore I set "stored=false" on my combined field, as I don't need to return the value, as it is only used for searching - in my case at least.

<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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文