如何从Java代码中选择Solr?

时间:2014-11-19 07:37:05

标签: java solr

我在Solr中保存数据:

String solrUrl = "http://localhost:8984/solr";
SolrServer solrServer = new HttpSolrServer( solrUrl );
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "1");
doc.addField("first_name", "Ann");
doc.addField("last_name", "Smit");
doc.addField("email", "test@test.com");
try {
   solrServer.add(doc);
   solrServer.commit();
} catch (SolrServerException e) {/* */}

我想在solr中搜索:

SolrQuery parameters = new SolrQuery();
parameters.setQuery("*:*");
parameters.setParam("first_name", "Ann");
QueryResponse response = null;
try {
   response = solrServer.query(parameters);
} catch (SolrServerException e) {/* */ }
SolrDocumentList list = response.getResults();

我有1条记录 - 它很好。但是当我设置parameters.setParam("first_name", "Ann1");时,我得到的结果相同。有什么问题?

3 个答案:

答案 0 :(得分:1)

parameters.setQuery("*:*");会将q=*:*添加到url,此查询会匹配solr中的所有文档(因为它的*通配符字符在两个字段中:value)。

parameters.setParam("first_name", "Ann");无效,因为这会将first_name=Ann查询参数添加到网址。 (请注意,您的过滤器应该作为qfq查询参数的值,而不是直接作为单独的查询参数!) 因此,最终查询将是q=*:*&first_name=Ann,其中使用lucene的语言来查询所有文档。

如果您尝试仅将文档与first_name==Ann匹配,则需要尝试?q=first_name:Ann

SolrQuery parameters = new SolrQuery();
parameters.setQuery("first_name:Ann");

答案 1 :(得分:1)

根据您在 setQuery(" ")中的查询进行搜索;

SolrQuery query = new SolrQuery();
query.setQuery("*:*");
query.setFields("id","first_name","last_name");
query.setStart(0);
query.setRows(100);
QueryResponse response = server.query(query);
SolrDocumentList docResults = response.getResults();

您的查询应该在setQuery方法中,而setFields()将仅在指定字段上进行搜索。

您正在搜索*:*以便返回所有文件。 setParam(" first_name"," Ann")无效。如下所示更改您的代码。

SolrQuery query = new SolrQuery();
query.setQuery("first_name:Ann1");

答案 2 :(得分:0)

应该使用:

SolrQuery query = new SolrQuery();
query.setQuery("*:*");
query.addFilterQuery("first_name:qwe*", "last_name:qwe*");
query.setFields("id","first_name","last_name","email");
QueryResponse response = null;
try {
    response = solrServer.query(query);
} catch (SolrServerException e) {e.printStackTrace();}
SolrDocumentList list = response.getResults();