在实际索引它们之前,我需要测试某些文档是否与查询匹配。你会怎么做?我正在考虑的一种可能性是在内存(ramdisk?)上运行一个普通的 lucene 索引,并在将它发送到实际的 Solr 服务器之前,为我拥有的每个新文档执行一个索引 -> 测试查询 -> 删除循环。
谁能想到一个更好的解决方案来解决这个问题?
非常感谢。
更新:
看起来这可能是一个很好的起点:http ://www.lucenetutorial.com/lucene-in-5-minutes.html
在实际索引它们之前,我需要测试某些文档是否与查询匹配。你会怎么做?我正在考虑的一种可能性是在内存(ramdisk?)上运行一个普通的 lucene 索引,并在将它发送到实际的 Solr 服务器之前,为我拥有的每个新文档执行一个索引 -> 测试查询 -> 删除循环。
谁能想到一个更好的解决方案来解决这个问题?
非常感谢。
更新:
看起来这可能是一个很好的起点:http ://www.lucenetutorial.com/lucene-in-5-minutes.html
由于 Solr 允许事务/提交,您实际上可以对它们进行索引,并且在您提交之前声明一个删除查询,该查询会删除所有不匹配的文档。
/**
* @author Omnaest
*/
public class SolrSimpleIndexingTest
{
protected SolrServer solrServer = newSolrServerInstance();
@Test
public void testSolr() throws IOException,
SolrServerException
{
{
SolrInputDocument solrInputDocument = new SolrInputDocument();
{
solrInputDocument.addField( "id", "0" );
solrInputDocument.addField( "text", "test1" );
}
this.solrServer.add( solrInputDocument );
}
{
SolrInputDocument solrInputDocument = new SolrInputDocument();
{
solrInputDocument.addField( "id", "1" );
solrInputDocument.addField( "text", "test2" );
}
this.solrServer.add( solrInputDocument );
}
this.solrServer.deleteByQuery( "text:([* TO *] -test2)" );
this.solrServer.commit();
/*
* Now your index does only contain the document with id=1 !!
*/
QueryResponse queryResponse = this.solrServer.query( new SolrQuery().setQuery( "*:*" ) );
SolrDocumentList solrDocumentList = queryResponse.getResults();
assertEquals( 1, solrDocumentList.size() );
assertEquals( "1", solrDocumentList.get( 0 ).getFieldValue( "id" ) );
}
/**
* @return
*/
private static CommonsHttpSolrServer newSolrServerInstance()
{
try
{
return new CommonsHttpSolrServer( "http://localhost:8983/solr" );
}
catch ( MalformedURLException e )
{
e.printStackTrace();
fail();
}
return null;
}
}