标签: hibernate-search

在运行时获取注释信息

我想知道是否有任何方法可以在运行时获取类的注释信息?因为我想获得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)

java annotations runtime hibernate-search

6
推荐指数
1
解决办法
7337
查看次数

Hibernate Search QueryBuilder:查询非实体字段

我试图使用来自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做了伎俩)

lucene hibernate-search

6
推荐指数
0
解决办法
1265
查看次数

EC2上的JGroups节点虽然看到了彼此,却没有说话

我正在尝试使用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)

java jgroups hibernate-search infinispan

6
推荐指数
1
解决办法
1511
查看次数

Hibernate搜索,infinispan,jclouds和Amazon S3 - IllegalArgumentException:bucketId:A96137216.bz2(预期:整数)

我正在尝试使用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的帮助都表示赞赏.

提前致谢.

lucene amazon-s3 hibernate-search infinispan jclouds

6
推荐指数
0
解决办法
256
查看次数

在Web应用程序中启动Hibernate Search时出错

有人可以提供帮助,我将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 lucene hibernate-search

5
推荐指数
1
解决办法
6155
查看次数

Java泛型 - 类<?>构造函数参数问题

我已经使用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)

我认为,从给定的例子中我所面临的问题是显而易见的.
有人可以建议在这里可以做些什么,或者一些替代方案?

java generics search hibernate hibernate-search

5
推荐指数
1
解决办法
3200
查看次数

外部实体更改后索引不更新

我目前正在开发一个项目,以使用 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)

java indexing jpa hibernate-mapping hibernate-search

5
推荐指数
1
解决办法
2071
查看次数

HibernateSearch ClassBridge - 排序和分面不适用于HS 5.5.1

我刚刚在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)

java sorting lucene hibernate hibernate-search

5
推荐指数
0
解决办法
207
查看次数

如何使用Elasticsearch集成按类型查询配置类型名称或过滤器?

我正在使用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

5
推荐指数
1
解决办法
78
查看次数

未找到休眠搜索类异常 Lucene Field$TermVector

我正在尝试将 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)

java lucene hibernate gradle hibernate-search

5
推荐指数
1
解决办法
1279
查看次数