在Solr / SolrJ中搜索所有字段

时间:2012-08-26 17:06:27

标签: java solr solrj

是否有一种简单的方法来构建一个查询,使用一次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服务器来完成此操作吗?怎么样?

3 个答案:

答案 0 :(得分:2)

这最好在架构中完成。定义fullSearch字段(使用相应的fieldType),然后使用copyField指令将要搜索的所有字段复制到此新字段中。 (重建索引)。然后在您的查询中,您只搜索这一个字段。

答案 1 :(得分:0)

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

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

  

uf =“* allFields”

     

f.allFields.qf =“customerName customerAddress customerNotes”

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

答案 2 :(得分:0)

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

您可以在solrconfig.xml中为requesthandler配置默认值。

<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 );