1

Solr 使用 Lucene 的全文搜索。这是否意味着我必须将所有内容都转换为文本?例如,我有如下文件:

   <field name="rollno" type="int" indexed="true" stored="true"/>
   <field name="name" type="string" indexed="true" stored="true"/>

以及基于这些文件的文件,

 <doc>
      <field name="id">1</field>
      <field name="rollno">32</field>
      <field name="name">John Milton</field>
 </doc>

我必须将它们全部转换为这样的文本?

<copyField source="name" dest="text"/>
<copyField source="rollno" dest="text"/>

和我的搜索处理程序一样,

<requestHandler name="/select" class="solr.SearchHandler">
     <lst name="defaults">
       <str name="echoParams">explicit</str>
       <int name="rows">100</int>
       <str name="df">text</str>
     </lst>
</requestHandler>

请澄清我的疑问。

4

3 回答 3

1

您无需将所有内容都转换为文本。

这取决于字段的内容。
您通常会将文本字段类型用于其中包含更多内容的字段。
使用文本字段,您可以进行大量处理以使内容可搜索
例如
- 可以应用小写过滤器以使您的搜索不区分大小写 - 可以应用同义词来标记同义词,如车辆、汽车等
- 可以应用词干提取使单词可以按词根搜索,例如银行银行等
- 以及更多用于 At&t 和 Att 等的单词分隔符...

您通常不希望将相同的分析应用于所有字段。
例如,您不希望将词干分析器应用于人名或作者姓名,因为它可能匹配不正确。

对于整数和字符串字段,如果字段已编入索引,您仍然可以在不将它们标记为文本的情况下搜索它们。

复制字段需要将所有内容复制到具有单一字段类型的字段。
如果您不想使用复制字段,可以使用edismax解析器并仍然搜索多个字段。

<requestHandler name="standard" class="solr.SearchHandler" default="true">
    <lst name="defaults">
        <str name="defType">edismax</str>
        <str name="echoParams">explicit</str>
        <str name="qf">rollno name</str>
        <str name="q.alt">*:*</str>
    </lst> 
</requestHandler>
于 2012-08-27T10:41:31.430 回答
0

在 schema.xml 文件中,如果未设置 fieldName,则默认设置用于搜索查询的defaultSearchField 。

<defaultSearchField>text</defaultSearchField>

requestHandler 中的df参数用于类似目的。它会覆盖 schema.xml 文件中定义的默认字段。

如果您使用copyField向此参数添加多个字段,则您可以搜索所有字段,无论其类型如何。

因此,当您按如下方式创建查询时,它会搜索默认字段。

http://localhost:8080/solr/select/?q=searchText

如果要在特定字段中搜索,则应按如下方式创建查询。以下查询将搜索 rollno 字段。

http://localhost:8080/solr/select/?q=rollno:32
于 2012-08-27T10:38:05.210 回答
0

你搞错了。copyField 不会将其转换为文本。它将值从名为 name 的字段复制到名为 text 的字段。这通常用于有一个包含所有值的字段。此字段通常是您的默认搜索字段。让我解释一下为什么这样做:

如果您在上面发布了 2 字段,则必须声明哪一个是您的默认搜索字段。让我们说名字。如果您现在使用没有任何查询语法的普通表达式查询服务器,则将仅搜索字段名称。但通常您也希望搜索字段 rollno。要在没有任何查询语法的情况下执行此操作,您需要声明另一个字段,在本例中名为 text。现在,您将字段名称和字段 rollno 中的值复制到字段文本并将其定义为默认搜索字段。如果您现在搜索 John Milton 或 42,将找到该文档。希望这可以帮助你一点。

于 2012-08-27T10:45:59.457 回答