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>
请澄清我的疑问。
答案 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,则会找到该文档。希望这可以帮到你一点。