全文搜索意味着将所有内容转换为文本?

时间:2012-08-27 10:16:24

标签: solr

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>

请澄清我的疑问。

3 个答案:

答案 0 :(得分:1)

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

这取决于该领域的内容 您通常会将文本字段类型用于包含更多内容的字段 With text field you can a lot handling to make the content searchable
例如
  - 可以应用小写过滤器,使您的搜索不敏感   - 可以应用同义词来标记车辆,汽车等同义词   - 可以应用词干来使词语可以根源搜索,例如银行银行等   - 还有更多关于At&amp; 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>

答案 1 :(得分: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

答案 2 :(得分:0)

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

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