我想知道是否有任何方法可以在运行时获取类的注释信息?因为我想获得sepcifily注释的属性.
例:
class TestMain {
@Field(
store = Store.NO)
private String name;
private String password;
@Field(
store = Store.YES)
private int age;
//..........getter and setter
}
Run Code Online (Sandbox Code Playgroud)
注释来自hibernate-search,现在我想要的是将"TestMain"的哪个属性注释为"字段"(在示例中,它们是[name,age]),并且"存储"( store = store.yes)'(在示例中,它们是[ age ])在运行时.
有任何想法吗?
更新:
public class FieldUtil {
public static List<String> getAllFieldsByClass(Class<?> clazz) {
Field[] fields = clazz.getDeclaredFields();
ArrayList<String> fieldList = new ArrayList<String>();
ArrayList<String> storedList=new ArrayList<String>();
String tmp;
for (int i = 0; i < fields.length; i++) {
Field fi = fields[i];
tmp = fi.getName();
if …Run Code Online (Sandbox Code Playgroud) 我试图使用来自Hibernate Search的QueryBuilder,其中的字段不是相应实体的属性,而是使用ClassBridge在运行中构建.我能这样做吗?
QueryBuilder qb = fullTextEntityManager.getSearchFactory().
buildQueryBuilder().forEntity(Publication.class).get();
....
Query query = qb.keyword().onField("title").matching("Lärm").createQuery();
Run Code Online (Sandbox Code Playgroud)
字段"title"不是Publication类的一部分,但在Lucene索引中可用(并且可搜索).
更新:根据https://forum.hibernate.org/viewtopic.php?f=9&t=1008943,以下工作:
QueryBuilder qb = fullTextEntityManager.getSearchFactory().
buildQueryBuilder().forEntity(Publication.class).get();
....
Query query = qb.keyword().onField("title").ignoreFieldBridge().matching("Lärm").createQuery();
Run Code Online (Sandbox Code Playgroud)
(ignoreFieldBridge做了伎俩)
我正在尝试使用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) 我正在尝试使用Hibernate Search来使用在Amazon S3上托管的Lucene索引,但是我得到以下异常:
Exception in thread "LuceneIndexesData-CloudCacheStore-0" java.lang.IllegalArgumentException: bucketId: A96137216.bz2 (expected: integer)
at org.infinispan.loaders.bucket.Bucket.setBucketId(Bucket.java:84)
at org.infinispan.loaders.cloud.CloudCacheStore.readFromBlob(CloudCacheStore.java:450)
at org.infinispan.loaders.cloud.CloudCacheStore.scanBlobForExpiredEntries(CloudCacheStore.java:292)
at org.infinispan.loaders.cloud.CloudCacheStore.purge(CloudCacheStore.java:284)
at org.infinispan.loaders.cloud.CloudCacheStore.purgeInternal(CloudCacheStore.java:336)
at org.infinispan.loaders.AbstractCacheStore$2.run(AbstractCacheStore.java:111)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
在s3中持久化lucene索引的文档有点稀疏但我认为我在正确的轨道上.我正在尝试在我的应用程序中嵌入infinispan,所以我在hibernate.cfg.xml中指定了infinispan XML的路径如下所示
<property name="hibernate.search.default.directory_provider">infinispan</property>
<property name="hibernate.search.infinispan.configuration_resourcename">infinispan-amazons3.xml</property>
<property name="hibernate.search.infinispan.chunk_size">300000000</property>
Run Code Online (Sandbox Code Playgroud)
而我的infinispan-amazons3.xml是:
<infinispan>
<default>
<loaders>
<cloudStore xmlns="urn:infinispan:config:cloud:5.3"
cloudService="aws-s3"
identity="user"
password="password"
bucketPrefix="bucket">
</cloudStore>
</loaders>
</default>
</infinispan>
Run Code Online (Sandbox Code Playgroud)
我正在使用以下版本(maven pom.xml)
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search</artifactId>
<version>4.4.4.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-infinispan</artifactId>
<version>4.4.4.Final</version>
</dependency>
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-cachestore-cloud</artifactId>
<version>5.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.jclouds.provider</groupId>
<artifactId>aws-s3</artifactId>
<version>1.4.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
任何有关使用hibernate-search和Amazon S3的帮助都表示赞赏.
提前致谢.
有人可以提供帮助,我将hibernate搜索放入我的网络应用程序并收到以下错误:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost/postgres</property>
<property name="hibernate.connection.username">postgres</property>
<property name="hibernate.connection.password">noor</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="current_session_context_class">thread</property>
<property name="hibernate.search.default.indexBase">
/users/application/indexes
</property>
<property name="hibernate.search.default.indexBase">
/users/application/indexes
</property>
<mapping resource="com/BiddingSystem/Models/Users.hbm.xml"/>
<mapping resource="com/BiddingSystem/Models/ForumTopic.hbm.xml"/>
<mapping resource="com/BiddingSystem/Models/ForumMessage.hbm.xml"/>
<mapping resource="com/BiddingSystem/Models/Administrator.hbm.xml"/>
<mapping resource="com/BiddingSystem/Models/PersonalUser.hbm.xml"/>
<mapping resource="com/BiddingSystem/Models/BusinessUser.hbm.xml"/>
<mapping resource="com/BiddingSystem/Models/BusinessContactNumbers.hbm.xml"/>
<mapping resource="com/BiddingSystem/Models/Attribute.hbm.xml"/>
<mapping resource="com/BiddingSystem/Models/AttributeOption.hbm.xml"/>
<mapping resource="com/BiddingSystem/Models/Category.hbm.xml"/>
<mapping resource="com/BiddingSystem/Models/Item.hbm.xml"/>
<mapping resource="com/BiddingSystem/Models/Auction.hbm.xml"/>
<mapping resource="com/BiddingSystem/Models/Picture.hbm.xml"/>
<mapping resource="com/BiddingSystem/Models/Bid.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
org.hibernate.HibernateException: could not init listeners
at org.hibernate.event.EventListeners.initializeListeners(EventListeners.java:205)
at org.hibernate.cfg.Configuration.getInitializedEventListeners(Configuration.java:1980) …Run Code Online (Sandbox Code Playgroud) 我已经使用Java很长一段时间了,但有些事情对我来说仍然不太清楚,特别是涉及到泛型......
事情就是这样:我Search正在使用这个类(详见此处),构造如下:
public Search(Class<?> searchClass) {...}
Run Code Online (Sandbox Code Playgroud)
此外,我有一个参数化的通用包装器,如下所示:
public class HibernateSearch<E> extends Search implements Serializable {
public HibernateSearch(Class<E> entityClass) {
super(entityClass);
}
// ... omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
现在,我需要的是以下内容:我想创建参数化类,其中包含此类作为其字段,例如
public class BaseSelectorComposer<T> extends SelectorComposer<Window> {
private HibernateSearch<T> searchObject;
...
@Override
public void doAfterCompose(Window comp) throws Exception {
super.doAfterCompose(comp);
this.searchObject =
new HibernateSearchObject<T>( now what...??? );
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
我认为,从给定的例子中我所面临的问题是显而易见的.
有人可以建议在这里可以做些什么,或者一些替代方案?
我目前正在开发一个项目,以使用 JPA 2.1 保存数据并使用休眠搜索 4.5.0.final 搜索实体。
映射类和索引后,搜索工作正常。
但是,当我将classB的值描述从“someStr”更改为“anotherStr”时。数据库也相应更新了,但是当我使用Luke检查索引时,索引中的classA.classB.description没有更新,并且无法通过关键字“anotherStr”搜索数据,但可以通过关键字“someStr”进行搜索。
在我重新索引整个数据库后,它终于更新了。
根据 Hibernate 搜索网站,
简短的回答是索引是自动的:Hibernate Search 将透明地索引每个通过 Hibernate ORM 持久化、更新或删除的实体。它的任务是保持索引和你的数据库同步,让你忘记这个问题。
但这在我的情况下不起作用。我不确定我是否遗漏了一些细节,或者我需要自己处理此类问题。
我还尝试按照this one的建议在classB上添加注释@Indexed ,但它仍然没有解决我的问题。
据我所知,解决方案是定期重新索引数据库。但是重新索引会禁用搜索功能,并且在大多数情况下这不是一个选项。
有人可以给一些建议吗?谢谢。
我有一个类,它通过使用 @IndexedEmbedded 注释嵌入了一些其他类。这是我的类映射的简化版本。
Class A
@Entity(name = "classA")
@Indexed
public class classA extends Model {
private int id;
private String name;
private ClassB place;
...
some constructors
...
@Id
@GeneratedValue
@DocumentId
public int getId() {
return id;
}
@Column(name = "name")
@Field(analyze = Analyze.NO, store = Store.YES) // only used for sorting …Run Code Online (Sandbox Code Playgroud) 我刚刚在hibernate搜索论坛上发布了这个并没有得到任何响应,所以再次尝试在stackoverflow ...
由于从HS 4.5.1迁移到HS 5.5.1,我们在排序和分面方面存在问题.
我们所有的索引都使用类桥来完成,该类调用CDI-Bean来进行实际的索引.在我们的系统中,索引哪些字段的配置是动态的,并且可以在运行时更改,因此我们不能使用HS注释.
排序:我们希望利用docureues利用lucene的新排序功能.我们尝试向MetadataProvidingFieldBridge类桥添加接口以提供哪些字段是排序字段的信息,但是当类桥被初始化时(当jboss启动时)CDI-bean尚不可用.
问题1:SearchIntegrator当CDI-bean可用或我们的索引配置发生变化时,有没有办法在以后重新初始化HS- ?目前HS回归到使用UninvertingReaderfor来处理没有docvalues的排序字段.
问题2:将来会支持这个吗?使用性能有多"糟糕" UninvertingReader?
使用faceting我们面临类似的问题,我们不能使用@Facet-annotation,因为配置是动态的.目前我们直接使用lucene的faceting API.
问题3:HS是否有计划在不久的将来通过类桥添加分面信息,类似于MetadataProvidingFieldBridge?将来Hibernate Search会支持类桥吗?
ClassBridge代码:
public class FtiClassBridgeCE implements FieldBridge, MetadataProvidingFieldBridge
{
@Override
public void set(String fieldName, Object value, Document document, LuceneOptions options)
{
if( !(value instanceof ComplexEntity))
return; // ignore
ComplexEntity object = (ComplexEntity)value;
// FtiService does the actual indexing by adding fields to given document
Configuration.service( FtiService.class).setIndexData( object, new FtiDocumentHS( document, options));
}
/* …Run Code Online (Sandbox Code Playgroud) 我正在使用Hibernate Search与Elasticsearch集成版本5.8.2和5.6.
假设我有两个使用相同数据库的应用程序,我想搜索Person实体.两个应用程序都将更新索引,但只会读取其中一个.
因为默认情况下Hibernate Search对types 使用完全限定的类名,所以我最终为同一个实体提供了2种不同的类型:
Person - > com.example.x.Person
Person - > com.example.y.Person
在我正在执行搜索的应用程序中,在构建搜索查询时,Hibernate Search会自动添加filter查询type:
"filter": {
"type": {"value": "com.example.x.Person"}
}
Run Code Online (Sandbox Code Playgroud)
因此搜索结果不包含com.example.y.Person类型的记录.
有什么办法可以自定义类型名称吗?
或者,有没有办法禁用/自定义添加的filter查询?
我正在尝试将 Hibernate Search 集成到我的 Spring 启动应用程序中,每次尝试使用 @Indexed (org.hibernate.search.annotations.Indexed) 注释时,我都会收到以下错误
Caused by: java.lang.ClassNotFoundException: org.apache.lucene.document.Field$TermVector
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 133 more
Run Code Online (Sandbox Code Playgroud)
我有以下相关的 gradle 依赖项。
compile 'org.hibernate:hibernate-search-orm:5.10.3.Final'
compile 'org.apache.lucene:lucene-core:7.4.0'
Run Code Online (Sandbox Code Playgroud)
我也试过没有 lucene 依赖。我还有以下休眠和 JPA 依赖项。
compile 'javax.persistence:javax.persistence-api:2.2'
compile 'org.hibernate:hibernate-core:5.3.3.Final'
compile 'org.hibernate:hibernate-java8:5.3.3.Final'
compile 'org.hibernate:hibernate-entitymanager:5.3.3.Final'
Run Code Online (Sandbox Code Playgroud)
这让我完全疯了,因为我在教程或 SO 帖子中找不到任何内容。随意询问您认为合适的更多上下文。
编辑:将 Lucene 版本恢复到 5.5.4 给了我以下错误
java.lang.ClassNotFoundException: org.apache.lucene.analysis.standard.StandardAnalyzer
Run Code Online (Sandbox Code Playgroud)