我在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");
时,我得到的结果相同。有什么问题?
答案 0 :(得分:1)
parameters.setQuery("*:*");
会将q=*:*
添加到url,此查询会匹配solr中的所有文档(因为它的*通配符字符在两个字段中:value)。
parameters.setParam("first_name", "Ann");
无效,因为这会将first_name=Ann
查询参数添加到网址。 (请注意,您的过滤器应该作为q
或fq
查询参数的值,而不是直接作为单独的查询参数!)
因此,最终查询将是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();