我的以下 Lucene 查询
org.apache.lucene.search.Query luceneQuery = qb.bool()
.should(qb.keyword().onField("name").matching(searchString.toLowerCase()).createQuery()).createQuery();
result= getFullTextEntityManager().createFullTextQuery(luceneQuery, Verb.class).setProjection(ProjectionConstants.THIS, ProjectionConstants.SCORE).setMaxResults(1).getResultList();
对于 searchString 'mix' 返回:[null, 6.170484]
这是我第一次观察到 null 作为匹配项而不是匹配的实例返回。
以下是我的 Verb.class 上的注释
@Field(analyze=Analyze.YES, store=Store.YES, termVector=TermVector.YES)
private String name;
有人有什么想法吗?
TIA
编辑
@Entity
@Table(name="mverb")
@Indexed
public class Verb extends Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Field(analyze=Analyze.YES, store=Store.YES, termVector=TermVector.YES)
private String name;
}
在应用程序加载时
indexAllVerbs();
searchVerbs("mix");
功能:
protected FullTextEntityManager getFullTextEntityManager() {
return Search.getFullTextEntityManager(em);
}
public void indexAllVerbs() {
for (Verb b : Foo.getVerbs()) {
getFullTextEntityManager().index(b);
}
}
public List<Object[]> searchVerbs(String searchString) {
QueryBuilder qb = getFullTextEntityManager().getSearchFactory().buildQueryBuilder().forEntity(Verb.class).get();
org.apache.lucene.search.Query luceneQuery = qb.bool()
.should(qb.keyword().onField("name").matching(searchString.toLowerCase()).createQuery()).createQuery();
return getFullTextEntityManager().createFullTextQuery(luceneQuery, Verb.class).setProjection(ProjectionConstants.THIS, ProjectionConstants.SCORE).setMaxResults(1).getResultList();
}
最佳答案
这很可能意味着从匹配文档中提取的标识符与数据库中的任何实体都不匹配。
两个可能的原因:
- 您在 ID 上使用了异国情调的现场桥,但效果不佳。检查您的实现情况。
- 由于某种原因,您的索引不同步。 Reindex your database .
关于java - Apache Lucene createFullTextQuery 返回匹配的空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46318519/