我正在学习Hibernate Search Query DSL,我不知道如何使用AND或OR等布尔参数构造查询.
例如,假设我想要返回firstName值为"bill"或"bob"的所有人员记录.
在hibernate文档之后,一个示例使用bool()方法w /两个子查询,例如:
QueryBuilder b = fts.getSearchFactory().buildQueryBuilder().forEntity(Person.class).get();
Query luceneQuery = b.bool()
.should(b.keyword().onField("firstName").matching("bill").createQuery())
.should(b.keyword().onField("firstName").matching("bob").createQuery())
.createQuery();
logger.debug("query 1:{}", luceneQuery.toString());
Run Code Online (Sandbox Code Playgroud)
这最终产生了我想要的lucene查询,但这是在hibernate搜索中使用布尔逻辑的正确方法吗?"should()"是否等同于"OR"(类似地,"must()"对应于"AND")?
此外,以这种方式编写查询感觉很麻烦.例如,如果我有一个firstNames的集合可以匹配怎么办?这种类型的查询首先是DSL的良好匹配吗?
这是Lucene的新手.我在Java客户端中使用Hibernate,并且在特定查询中遇到此错误:
HSEARCH000146: The query string 'a' applied on field 'name' has no meaningfull tokens to
be matched. Validate the query input against the Analyzer applied on this field.
Run Code Online (Sandbox Code Playgroud)
搜索适用于所有其他查询,即使是空结果集.我的测试数据库确实记录了'a'.这可能有什么问题?
Hibernate搜索根据相关性对结果进行排序,这很正常.除此之外,如果两个文档具有相同的分数,则按主键排序.
例如,
book1:id = 1,bookTitle ="hibernate search by example".
book2:id = 2,bookTitle ="hibernate search in action"
如果我正在进行查询以查找术语"hibernate search",我会有这个顺序:book1然后book2
我想颠倒这个顺序:book2然后book1.这意味着反转主键顺序.如果没有实现自定义相似性,是否有可能实现此目的?同时保持相关性秩序.
我正在研究针对我们的数据库提供更好搜索功能的机制.它目前是一个巨大的瓶颈(导致长期查询损害了我们的数据库性能).
我的老板想让我看看Solr,但经过仔细观察,似乎我们真的想要一些与Lucene本身的数据库集成机制.
从Lucene FAQ中,他们推荐使用Hibernate Search,Compass和DBSight.
作为我们当前技术堆栈的背景,我们在Tomcat上使用直接JSP,没有Hibernate,在其上没有其他框架......只针对DB2数据库直接使用Java,JSP和JDBC.
鉴于此,似乎Hibernate Search可能更难以集成到我们的系统中,尽管在这样的集成之后可以选择使用Hibernate.
有没有人可以使用其中一种工具(或其他类似的基于Lucene的解决方案)分享可能有助于选择合适工具的经验?
它需要是一个FOSS解决方案,理想情况下将自动更新来自数据库的更新Lucene(尽管有效),而无需额外的努力在更改时通知工具(否则,似乎滚动我自己的Lucene解决方案将只是一样好).此外,我们有多个应用程序服务器只有一个数据库(+故障转移),因此如果能够轻松地无缝地使用所有应用程序服务器的解决方案,那就太好了.
我现在继续检查选项,但是利用其他人的经验会非常有帮助.
我正在开发一个Java Web应用程序,使用JBoss Seam作为应用程序框架.我想利用Hibernate Search来提供实体搜索功能.整合已经很好,我正在接近部署.生产中的应用程序的设置将是:
我的问题是,我如何配置Hibernate Search,以便在App Server#1上持有实体时,在App Server#2上更新本地Lucene索引,反之亦然?Hibernate Search是否支持任何类型的群集配置?由于持久化可能发生在任何一个负载均衡的应用服务器上,因此设置必须是某种主 - 主.
有没有人有任何关于如何解决这个问题的建议?感谢您的帮助!
在我的一个应用程序中,我将在多个字段/列上执行搜索.它是一个高级搜索,有超过20个字段,用户可以使用这些字段搜索结果.例如,用户可以基于搜索预订
和13个这样的领域.
我想知道是否
Hibernate Search可以而且应该在这里使用吗?如果是这样,怎么样?我无法找到使用Hibernate Search进行这种复杂搜索的示例.
我可以简单地使用Hibernate而不是Hibernate搜索,并根据参数的数量设计多线程搜索.这是个好主意吗?
这里可以使用Hibernate Filters吗?
有人可以提供输入或参考链接吗?
我有一个执行基于给定的输入标题字段搜索的搜索框,让用户建议先从文字是基于Lucene和Hibernate Search的inserted.It所有可用的标题.它一直工作,直到输入空间.然后结果消失了.例如,我希望"学习H"给我"学习Hibernate"作为结果.但是,这不会发生.你能告诉我我应该在这里使用什么呢?
查询生成器:
QueryBuilder qBuilder = fullTextSession.getSearchFactory()
.buildQueryBuilder().forEntity(LearningGoal.class).get();
Query query = qBuilder.keyword().wildcard().onField("title")
.matching(searchString + "*").createQuery();
BooleanQuery bQuery = new BooleanQuery();
bQuery.add(query, BooleanClause.Occur.MUST);
for (LearningGoal exGoal : existingGoals) {
Term omittedTerm = new Term("id", String.valueOf(exGoal.getId()));
bQuery.add(new TermQuery(omittedTerm), BooleanClause.Occur.MUST_NOT);
}
@SuppressWarnings("unused")
org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery(
query, LearningGoal.class);
Run Code Online (Sandbox Code Playgroud)
Hibernate类:
@AnalyzerDef(name = "searchtokenanalyzer",tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = StandardFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = StopFilterFactory.class,params = {
@Parameter(name = "ignoreCase", value = "true") }) })
@Analyzer(definition = "searchtokenanalyzer")
public …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的项目中使用Hibernate Search(现在使用junit + dbunit编写测试),但搜索查询不会返回任何结果.我昨天研究了这个问题并得出结论,问题是Hibernate Search与dbunit @DatabaseSetup不兼容(类似于这个未回答的问题中的类似问题:链接).我将提供更多细节,但首先是冷杉,有我的实体类:
@Entity
@Indexed
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "userId")
private Long id;
(...)
@Column(nullable = false, unique = true)
@Field(index = Index.YES, analyze=Analyze.YES, store=Store.NO)
private String email;
(...)
@Column(nullable = false, unique = true)
@Field(index = Index.YES, analyze=Analyze.YES, store=Store.NO)
private String username;
(...)
}
Run Code Online (Sandbox Code Playgroud)
我通过我的DAO将它保存到db:
@Repository
public class UserDAOImpl implements UserDAO {
@Autowired
private SessionFactory sessionFactory;
@Override
public long save(User toSave) {
return (Long) this.sessionFactory.getCurrentSession().save(toSave);
}
(...)
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Hibernate Search,以便将来自jgroupsSlave节点的Lucene索引的所有写入发送到jgroupsMaster节点,然后使用Infinispan将Lucene索引共享回来.一切都在本地工作,但是当节点在EC2上发现彼此时,它们似乎没有进行通信.
他们都在互相发送你正在发送的消息.
# master output sample
86522 [LockBreakingService,localCache,archlinux-37498] DEBUG org.infinispan.transaction.TransactionTable - About to cleanup completed transaction. Initial size is 0
86523 [LockBreakingService,LuceneIndexesLocking,archlinux-37498] DEBUG org.infinispan.transaction.TransactionTable - About to cleanup completed transaction. Initial size is 0
87449 [Timer-4,luceneCluster,archlinux-37498] DEBUG org.jgroups.protocols.FD - sending are-you-alive msg to archlinux-57950 (own address=archlinux-37498)
87522 [LockBreakingService,localCache,archlinux-37498] DEBUG org.infinispan.transaction.TransactionTable - About to cleanup completed transaction. Initial size is 0
87523 [LockBreakingService,LuceneIndexesLocking,archlinux-37498] DEBUG org.infinispan.transaction.TransactionTable - About to cleanup completed transaction. Initial size is 0
# slave output sample
85499 …Run Code Online (Sandbox Code Playgroud) public class Product {
private Long id;
private String name;
private String description;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法用 JpaRepository 实现对 Product 类的描述的全文搜索?
full-text-search hibernate hibernate-search spring-data-jpa spring-boot
hibernate-search ×10
hibernate ×7
java ×5
lucene ×4
database ×1
dbunit ×1
infinispan ×1
integration ×1
jgroups ×1
spring ×1
spring-boot ×1
tomcat ×1