我们正在构建电子商务应用程序.我们正在使用JAVA堆栈与Hibernate和Spring Framework.与所有电子商务应用程序一样,我们需要在我们的网站中构建搜索功能.
所以,我们遇到了Hibernate Search和Apache Solr.有人可以列出两者的优缺点,以便我们可以为企业搜索选择理想的解决方案吗?
我目前正在考虑将使用Spring,GWT,Hibernate,Jackrabbit,Hibernate Search/Lucene(以及其他)的单租户基于Java的Web应用程序转换为完全成熟的SaaS风格应用程序.
我偶然发现了一篇文章,其中强调了以下7个"事物"作为对单个租户应用程序进行重要更改以使其成为SaaS应用程序:
我的问题是,是否有人使用与我列出的类似技术在SaaS /多租户应用程序中实现上述任何7项内容?在我走上正在考虑的道路之前,我希望得到关于最佳方法的尽可能多的意见.
作为一个开始,我很确定我能够很好地处理如何在模型级别处理多个租户.我正在考虑为所有表添加租户ID,然后使用Hibernate过滤器(以及Hibernate Search的全文过滤器)根据登录用户的所有查询的租户ID进行过滤.
然而,我对性能也有一些担忧,特别是当我们的租户数量增长很多时.
任何有关如何实施此解决方案的建议都将受到高度赞赏(如果这个问题有点过于开放,我会道歉).
我在一个带有spring boot 1.4.0.RELEASE的应用程序中使用hibernate.
索引的实体看起来像是:
@Entity(name = "SearchableTariffItem")
@Indexed
public class SearchableTariffItem {
public static final String ZIFFER_ANALYZER_NAME = "ZIFFER_ANALYZER";
@GeneratedValue(strategy = GenerationType.TABLE)
@Id
private Long id;
...
}
Run Code Online (Sandbox Code Playgroud)
我第一次保存实体时现在收到以下警告:
2016-08-26 15:08:32.501 WARN 8476 — [apr-8080-exec-6] org.hibernate.orm.deprecation : HHH90000015: Found use of deprecated [org.hibernate.id.MultipleHiLoPerTableGenerator] table-based id generator; use org.hibernate.id.enhanced.TableGenerator instead. See Hibernate Domain Model Mapping Guide for details.
Run Code Online (Sandbox Code Playgroud)
不幸的是,我不知道在哪里可以配置我的应用程序(最好是在application.yml中)来使用TableGenerator该类.
我使用以下依赖项:
我想为我的用户提供最相关和最好的结果.例如,我奖励具有大标题,描述,附加照片等的记录.对于上下文:记录是自行车路线,具有路线点(坐标)和元数据,如照片,评论等.
现在,我使用了索引这些记录Hibernate,然后使用Lucenein 在索引中搜索Hibernate Search.为了对我的结果进行评分,我根据文档属性构建查询并在以下文件中提升它们(使用boostedTo())should BooleanJunction clause:
bj.should(qb.range().onField("descriptionLength").above(3000).createQuery()).boostedTo(3.0f);
bj.should(qb.range().onField("views.views").above(5000).createQuery()).boostedTo(3.0f);
bj.should(qb.range().onField("nameLength").above(20).createQuery()).boostedTo(1.0f);
bj.should(qb.range().onField("picturesLength").above(0).createQuery()).boostedTo(5.0f);
bj.should(qb.keyword().onField("routePoints.poi.participant").matching("true").createQuery()).boostedTo(10.0f);
Run Code Online (Sandbox Code Playgroud)
要尝试禁用Lucene的评分,我已经覆盖了DefaultSimilarity该类,将所有比较设置为1.0f得分并通过Hibernate配置启用它:
public class IgnoreScoringSimilarity extends DefaultSimilarity {
@Override
public float idf(long docFreq, long numDocs) {
return 1.0f;
}
@Override
public float tf(float freq) {
return 1.0f;
}
@Override
public float coord(int overlap, int maxOverlap) {
return 1.0f;
}
@Override
public float lengthNorm(FieldInvertState state) {
return 1.0f;
}
@Override
public float queryNorm(float sumOfSquaredWeights) {
return 1.0f;
}
} …Run Code Online (Sandbox Code Playgroud) 我正在使用Hibernate 4.3.0.Final/JPA 2.1,Hibernate Search 4.5.0.Final在WildFly 8.0.0.Final上运行.我的应用程序工作正常,但我正在创建索引时收到此休眠警告.
WARN org.hibernate.loader.Loader - HHH000444:遇到锁定请求,但是数据库喜欢锁定的方言报告是在单独的选择中完成的(后续锁定); 初始查询执行后,结果将被锁定
这是创建索引的方法:
public void createIndex() throws DAOException {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(this.entityManager);
try {
fullTextEntityManager.createIndexer(Colaborador.class)
.purgeAllOnStart(Boolean.TRUE)
.optimizeOnFinish(Boolean.TRUE)
.startAndWait();
}
catch (InterruptedException e) {
logger.error("Error creating index", e);
throw new DAOException(e);
}
}
Run Code Online (Sandbox Code Playgroud)
我做了一些搜索,我发现了一个"解决方案",或者更好的说,是一种抑制警告的方法.但是,我不知道这是否是最佳解决方案.解决方案建议扩展org.hibernate.dialect.Oracle10gDialect和覆盖public boolean useFollowOnLocking()返回的方法false.
其他重要的事情:这只发生在Hibernate版本4.2.0.Final之后.在此版本之前,没有useFollowOnLocking()方法.
新方言:
import org.hibernate.dialect.Oracle10gDialect;
public class MyOracle10gDialect extends Oracle10gDialect {
@Override
public boolean useFollowOnLocking() {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试为我的网站构建更好的自动完成功能.我想使用Hibernate Search这个,但就我实验而言,它只能为我找到完整的单词.
所以,我的问题是:是否可以只搜索一些字符?
例如.用户输入3个字母并使用休眠搜索向他显示我的db对象的所有单词,其中包含这3个字母?
PS.现在我正在使用"喜欢"的查询...但我的数据库增长了很多,我还希望将搜索功能扩展到另一个表...
我收到此错误:
java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
Run Code Online (Sandbox Code Playgroud)
这些是我的类路径中的jar:
com.sun.faces/jsf-api/jars/jsf-api-2.0.0.jar
com.sun.faces/jsf-impl/jars/jsf-impl-2.0.0.jar
org.apache.myfaces.orchestra/myfaces-orchestra-core20/jars/myfaces-orchestra-core20-1.5-SNAPSHOT.jar
commons-lang/commons-lang/jars/commons-lang-2.1.jar
commons-logging/commons-logging/jars/commons-logging-1.1.1.jar
org.springframework/spring/jars/spring-2.5.6.jar
commons-el/commons-el/jars/commons-el-1.0.jar
org.richfaces.ui/richfaces-ui/jars/richfaces-ui-3.3.3.Final.jar
org.richfaces.framework/richfaces-api/jars/richfaces-api-3.3.3.Final.jar
commons-collections/commons-collections/jars/commons-collections-3.2.jar
commons-beanutils/commons-beanutils/jars/commons-beanutils-1.8.0.jar
org.richfaces.framework/richfaces-impl-jsf2/jars/richfaces-impl-jsf2-3.3.3.Final.jar
com.sun.facelets/jsf-facelets/jars/jsf-facelets-1.1.14.jar
org.hibernate/hibernate-core/jars/hibernate-core-3.6.0.Final.jar
antlr/antlr/jars/antlr-2.7.6.jar
dom4j/dom4j/jars/dom4j-1.6.1.jar
org.hibernate/hibernate-commons-annotations/jars/hibernate-commons-annotations-3.2.0.Final.jar
org.slf4j/slf4j-api/jars/slf4j-api-1.6.1.jar
org.hibernate.javax.persistence/hibernate-jpa-2.0-api/jars/hibernate-jpa-2.0-api-1.0.0.Final.jar
javax.transaction/jta/jars/jta-1.1.jar
org.hibernate/hibernate-c3p0/jars/hibernate-c3p0-3.6.0.Final.jar
c3p0/c3p0/jars/c3p0-0.9.1.jar
org.hibernate/hibernate-entitymanager/jars/hibernate-entitymanager-3.6.0.Final.jar
cglib/cglib/jars/cglib-2.2.jar
asm/asm/jars/asm-3.1.jar
javassist/javassist/jars/javassist-3.12.0.GA.jar
org.hibernate/hibernate-search/jars/hibernate-search-3.3.0.Final.jar
org.hibernate/hibernate-search-analyzers/jars/hibernate-search-analyzers-3.3.0.Final.jar
org.apache.lucene/lucene-core/jars/lucene-core-3.0.3.jar
org.apache.lucene/lucene-analyzers/jars/lucene-analyzers-3.0.3.jar
mysql/mysql-connector-java/jars/mysql-connector-java-5.1.13.jar
com.ocpsoft/prettyfaces-jsf2/jars/prettyfaces-jsf2-3.0.1.jar
commons-digester/commons-digester/jars/commons-digester-2.0.jar
org.slf4j/slf4j-log4j12/jars/slf4j-log4j12-1.6.1.jar
log4j/log4j/bundles/log4j-1.2.16.jar
xom/xom/jars/xom-1.2.5.jar
xml-apis/xml-apis/jars/xml-apis-1.3.03.jar
xerces/xercesImpl/jars/xercesImpl-2.8.0.jar
xalan/xalan/jars/xalan-2.7.0.jar
org.jboss.jsfunit/jboss-jsfunit-core/jars/jboss-jsfunit-core-1.3.0.Final.jar
net.sourceforge.htmlunit/htmlunit/jars/htmlunit-2.8.jar
xalan/xalan/jars/xalan-2.7.1.jar
xalan/serializer/jars/serializer-2.7.1.jar
xml-apis/xml-apis/jars/xml-apis-1.3.04.jar
commons-collections/commons-collections/jars/commons-collections-3.2.1.jar
commons-lang/commons-lang/jars/commons-lang-2.4.jar
org.apache.httpcomponents/httpclient/jars/httpclient-4.0.1.jar
org.apache.httpcomponents/httpcore/jars/httpcore-4.0.1.jar
commons-codec/commons-codec/jars/commons-codec-1.4.jar
org.apache.httpcomponents/httpmime/jars/httpmime-4.0.1.jar
org.apache.james/apache-mime4j/jars/apache-mime4j-0.6.jar
net.sourceforge.htmlunit/htmlunit-core-js/jars/htmlunit-core-js-2.8.jar
xerces/xercesImpl/jars/xercesImpl-2.9.1.jar
net.sourceforge.nekohtml/nekohtml/jars/nekohtml-1.9.14.jar
net.sourceforge.cssparser/cssparser/jars/cssparser-0.9.5.jar
org.w3c.css/sac/jars/sac-1.3.jar
commons-io/commons-io/jars/commons-io-1.4.jar
cactus/cactus/jars/cactus-13-1.7.1.jar
cactus/cactus-ant/jars/cactus-ant-13-1.7.1.jar
commons-httpclient/commons-httpclient/jars/commons-httpclient-2.0.2.jar
junit/junit/jars/junit-3.8.1.jar
aspectj/aspectjrt/jars/aspectjrt-1.2.1.jar
cargo/cargo/jars/cargo-0.5.jar
ant/ant/jars/ant-1.5.4.jar
Run Code Online (Sandbox Code Playgroud)
这是我的ivy.xml:
<dependencies>
<!-- JSF 2.0 RI -->
<dependency org="com.sun.faces" name="jsf-api" rev="2.0.0"/>
<dependency …Run Code Online (Sandbox Code Playgroud) 我有一个查询,它在表的大约11个字符串或文本字段上进行ILIKE,这个字段不大(500 000),但对于ILIKE显然太大,搜索查询需要20秒.数据库是postgres 8.4
我需要实现这个搜索更快.
我想到了什么:
我从需要搜索的所有列中组装了另外的TVECTOR列,并在其上创建了全文索引.全文搜索非常快.但是......我无法在我的.hbms中映射这个TVECTOR类型.所以这个想法下降了(无论如何我更多地将它作为临时解决方案).
Hibernate搜索.(今天第一次听到它)它看起来很有希望,但我需要经验丰富的意见,因为我不想进入新的API,可能不是最简单的,因为可以做得更简单.
Lucene的
在任何情况下,这个表现在已经发生了,但我希望解决方案更通用,并应用于与全文搜索相关的未来案例.
所有建议都表示赞赏!
感谢名单
我了解并理解Elasticsearch,Apache Solr和Hibernate Search都基于Apache Lucene库.它们提供快速的全文搜索,所有这些都使用JPA注释,实现JPA和/或定义自定义注释.它们主要用于RDBMS/NoSQL数据存储.索引和可搜索的数据以文档的形式存在.
我完全可以,有人提出Solr vs Hibernate Search的问题- 选择何时以及何时?甚至'Elasticsearch vs Solr'或'Elasticsearch vs Hibernate Search'但是有一个Hibernate Search/Elasticsearch连接器作为一种使用Hibernate Search 和 Elasticsearch 的方法,或者这篇文章询问"如何将Hibernate和Solr集成在一起?" 答案如何将Hibernate Search和Solr集成在一起,这对我来说是不同的,对吧?
假设上述摘要是正确的,并且链接的帖子让我感到困惑:除了Hibernate Search之外,为什么人们会考虑或者使用Elasticsearch或Solr?这不是多余的吗?或者Hibernate Search是否为Solr/Elasticsearch提供了Hibernate ORM不具备的任何接口,因此仅用作某种适配器?
这是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-search ×10
hibernate ×8
java ×7
lucene ×4
solr ×2
autocomplete ×1
indexing ×1
ivy ×1
maven ×1
multi-tenant ×1
mysql ×1
oracle ×1
saas ×1
spring ×1
spring-boot ×1
warnings ×1