Lucene находит только несколько хитов - PullRequest
1 голос
/ 01 ноября 2011

Я пытаюсь сделать простой поиск по объекту Domain.class.У меня есть два теста.Первый должен создавать индексы, а второй выполняет фактический поиск.Когда я запускаю индекс, он выполняет только 25-30 операторов выбора для БД.Когда я делаю свой поисковый тест, он получает только 13 хитов.Это должно быть около 6300 хитов.

Это мой код:

public class luceneTests {
    DAOFacade dao = PMF.getTestDAO();

    @Test(enabled = false)//only run once to fill the index
    public void runFirstOnly() throws InterruptedException{
        EntityManager em = dao.getEntityManager();
        FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
        fullTextEntityManager.createIndexer(Domain.class).startAndWait();
    }

    @Test(enabled = true)
    public void simpleSearchTest(){

        EntityManager em =  dao.getEntityManager();
        FullTextEntityManager fullTextEntityManager =
        org.hibernate.search.jpa.Search.getFullTextEntityManager(em);
        em.getTransaction().begin();

        // create native Lucene query unsing the query DSL
        // alternatively you can write the Lucene query using the Lucene query parser
        // or the Lucene programmatic API. The Hibernate Search DSL is recommended though
        QueryBuilder qb = fullTextEntityManager.getSearchFactory()
        .buildQueryBuilder().forEntity( Domain.class ).get();
        org.apache.lucene.search.Query query = qb
        .keyword().wildcard()
        .onField("domain")
//      .andField("state")
        .matching("domaindom*")     
        .createQuery();
        // wrap Lucene query in a javax.persistence.Query
        javax.persistence.Query persistenceQuery =
        fullTextEntityManager.createFullTextQuery(query, Domain.class).;


        // execute search
        List result = persistenceQuery.setFirstResult(0).setMaxResults(100).getResultList();
        System.out.println("SIZE : " +result.size());
        for(Object o : result){
            if(o instanceof Domain)             
                System.out.println(" Object: "+o + ((Domain)o).getDomainId() + "  " + ((Domain)o).getNameservers());
        }
        em.getTransaction().commit();
        em.close();
    }
}

сущность домена

@Entity
@Indexed
@Table(name="Domain", schema="domains")
@DiscriminatorValue(value="DOMAIN")
public class Domain implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="domainId", nullable=false)
    public String domainId;

    @Column(name="domain", nullable=false)
    @Field(index = Index.UN_TOKENIZED, store= Store.NO)
    public String domain;

// there is alot more in this entity but I dont belive its needed.

Любые предложения о том, что я делаю здесь неправильно?

1 Ответ

0 голосов
/ 07 января 2013

Как создать свой EntityManager в DAO?Т.е.

EntityManager em = dao.getEntityManager ();

Возможно, этот EntityManager не видит изменения, сделанные ранее ...

...