gpt4 book ai didi

java - Hibernate + Lucene - 通配符搜索返回空结果

转载 作者:行者123 更新时间:2023-11-30 07:13:07 25 4
gpt4 key购买 nike

我写了一篇关于 Hibernate 搜索的文章,通过通配符搜索数据库表。

所以我已将其添加到我的 pom.xml 中:

    <dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-orm</artifactId>
<version>5.5.4.Final</version>
</dependency>

设置目录提供程序:

properties.put("hibernate.search.default.directory_provider", "ram");

并在我的实体上定义索引,以便搜索机制可见:

@Entity
@Table(name = "CUSTOM_ENTITY")
@Audited
@Indexed
public class CustomEntity implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
@DocumentId
private Long id;

@Column(name = "NAME1", nullable = false)
@NotEmpty
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
private String name1;

@Column(name = "NAME2", nullable = false)
@NotEmpty
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
private String name2;

@Column(name = "NAME3", nullable = false)
@NotEmpty
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
private String name3;

// ...
}

然后我从 SQL 脚本数据库表手动加载 - CUSTOM_ENTITY:

ID |NAME1 |NAME2 |NAME3 |
-------------------------
1 |Test1 |Test1 |Test1 |
2 |Test2 |Test2 |Test2 |
3 |Test3 |Test2 |Test2 |

并在我的存储库中运行代码:

FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);

QueryBuilder qBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(CustomEntity.class).get();

Query luceneQuery = qBuilder.keyword().wildcard().onFields("name1", "name2", "name3").matching("Test").createQuery();
// Query luceneQuery = qBuilder.keyword().wildcard().onFields("name1", "name2", "name3").matching("Test*").createQuery();
// Query luceneQuery = qBuilder.keyword().wildcard().onFields("name1", "name2", "name3").matching("Test%").createQuery();

List test = fullTextEntityManager.createFullTextQuery(luceneQuery, CustomEntity.class).getResultList();

但是每次结果集合都是空的。你知道我是否错过了任何步骤吗?我应该使用 Hibernate API 而不是 SQL 脚本加载数据吗?

<小时/>

编辑

在运行查询之前,我手动索引数据:

FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
try {
fullTextEntityManager.createIndexer().startAndWait();
} catch (InterruptedException e) {
e.printStackTrace();
}
QueryBuilder qBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(CustomEntity.class).get();

Query luceneQuery = qBuilder.keyword().wildcard().onFields("name1", "name2", "name3").matching("Test").createQuery();
// Query luceneQuery = qBuilder.keyword().wildcard().onFields("name1", "name2", "name3").matching("Test*").createQuery();
// Query luceneQuery = qBuilder.keyword().wildcard().onFields("name1", "name2", "name3").matching("Test%").createQuery();

List test = fullTextEntityManager.createFullTextQuery(luceneQuery, CustomEntity.class).getResultList();

结果还是一样。

感谢您的帮助。

最佳答案

如果使用 SQL 加载数据,则需要使用 Mass 索引器手动索引数据。请参阅https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#search-batchindex-massindexer .

如果您使用 Hibernate API,它们将自动编入索引。

关于java - Hibernate + Lucene - 通配符搜索返回空结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38851332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com