0

実際にインデックスを作成する前に、特定のドキュメントがクエリに一致するかどうかをテストする必要があります。これをどのように行いますか?私が考えている可能性の1つは、メモリ(ramdisk?)でプレーンなluceneインデックスを実行し、実際のSolrサーバーに送信する前に、新しいドキュメントごとにインデックス->テストクエリ->削除ループを実行することです。

誰かがこの問題のより良い解決策を考えることができますか?

どうもありがとう。

アップデート:

これは良い出発点になる可能性があるようです:http ://www.lucenetutorial.com/lucene-in-5-minutes.html

4

1 に答える 1

2

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;
  }
}
于 2012-04-14T11:59:21.173 に答える