0

有没有一种简单的方法来构建一个查询,使用一次调用 Solr 来搜索 Solr 索引中的所有字段?

我可以通过单独定义每个字段来搜索所有字段中的一些文本:

String textToSearchFor = "someText";
HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8983/solr");

SolrQuery query = new SolrQuery();
query.setQuery( "customerName:" + textToSearchFor
                + " OR customerAddress:" + textToSearchFor
                + " OR customerNotes:" + textToSearchFor
                );
query.setQueryType("edismax");
QueryResponse rsp = solrServer.query( query );

这种方法的问题是,如果在 Solr 模式中添加或删除字段,我必须更新此代码。我希望我设置我的查询请求,以便它搜索所有可用字段,而不会强迫我指定每个字段名称。

我可以通过对 Solr 服务器的一次调用来完成此操作吗?如何?

4

3 回答 3

2

这最好在模式本身中完成。定义一个fullSearch字段(使用适当的 fieldType),然后使用 copyField 指令将您要搜索的所有字段复制到这个新字段中。(重建索引)。然后在您的查询中,您只在这一个字段中进行搜索。

于 2012-08-26T17:49:45.780 回答
1

我可以看到您已经在使用为此目的而设计的Extended DisMax Query Parser 。您应该阅读有关Dismax Query Parser的文档,它是 eDismax 的某种父亲。eDismax 共享 dismax 查询解析器提供的大部分功能。

您可以在您的 solrconfig.xml 中为您的请求处理程序配置默认值。

<requestHandler name="standard" class="solr.StandardRequestHandler" default="true">
<!-- default values for query parameters -->
  <lst name="defaults">
    <str name="defType">edismax</str>
    <str name="q.alt">*:*</str>
    <!-- define the fields to query for here -->
    <str name="qf">customerName customerAddress customerNotes</str>
  </lst>
</requestHandler>

这样你的java代码就会减少,因为queryType已经默认定义为edismax。

String textToSearchFor = "someText";
HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8983/solr");

SolrQuery query = new SolrQuery();
query.setQuery(textToSearchFor);
QueryResponse rsp = solrServer.query( query );
于 2013-03-12T10:09:58.977 回答
0

如果您使用的是 Solr 3.6,那么您可以使用用户字段。有关详细信息,请参阅JIRA 问题和Wiki 页面。

您需要将以下内容添加到查询或solrconfig.xml

uf="* 所有字段"

f.allFields.qf="customerName customerAddress customerNotes"

之后,只需在字段中allFields搜索,它将在 3 个字段中进行搜索customerName customerAddress customerNotes。您可以根据需要创建任意数量的此类用户字段。

于 2012-08-27T02:29:19.500 回答