当存在@EmbeddedId 字段时,应实现自定义字段桥。有一个关于它的功能打开https://hibernate.atlassian.net/browse/HSEARCH-1879。但它还没有准备好。
在这种情况下,正确实现的接口是TwoWayFieldBridge?
下面是我对具有 5 个字段的复合 ID 的实现。
public class ChavePrimariaAcompanhamentoBridge implements TwoWayFieldBridge {
@Override
public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
AcompanhamentoPK chavePrimaria = (AcompanhamentoPK) value;
Integer ano = chavePrimaria.getAno();
Integer mes = chavePrimaria.getMes();
Long codigoCredenciada = chavePrimaria.getCredenciada().getCodigo();
Long codigoPosto = chavePrimaria.getPostoAtendimento().getCodigo();
Integer numeroSequencial = chavePrimaria.getNumeroSequencial();
luceneOptions.addNumericFieldToDocument("mes", mes, document);
luceneOptions.addNumericFieldToDocument("ano", ano, document);
luceneOptions.addNumericFieldToDocument("credenciada.codigo", codigoCredenciada, document);
luceneOptions.addNumericFieldToDocument("postoAtendimento.codigo", codigoPosto, document);
luceneOptions.addNumericFieldToDocument("numeroSequencial", numeroSequencial, document);
}
@Override
public Object get(String name, Document document) {
AcompanhamentoPK …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 Hibernate Search 集成到 Spring Boot 2 应用程序中。我已经按照其网站上的兼容性列表尝试了不同的版本,但当应用程序启动和“fullTextEntityManager.createIndexer().startAndWait();”时我总是收到此错误 被执行:
线程“main”中的异常 java.lang.IllegalArgumentException:HSEARCH000349:某些指定的实体类型(“class java.lang.Object”)未建立索引,它们的任何子类也未建立索引。
经过三天的谷歌搜索和尝试了很多事情之后,我不知道我还能做什么。
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
...
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>${opencsv.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-orm</artifactId>
<version>5.10.6.Final</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-spatial</artifactId> …Run Code Online (Sandbox Code Playgroud) 如何在Lucene Search中使用带有StandardAnalyzer的booleanQuery?
想象一下,我正在建立一个标签搜索.我的主索引类型称为Post,它有一个Hashtag项列表,标记为IndexedEmbedded.另外,每个帖子都有一个Comment对象列表,每个对象都包含一个Hashtag对象列表.
在搜索方面,我使用MultiFieldQueryParser,我传递了一长串可能的搜索字段,包括一些嵌套字段,如:
hashTags.value 和
coments.hashTags.value
现在,有趣的事情发生在我想搜索某些东西时,比如#architecture.我找出了主题标签的位置,所以最简单的逻辑做法是将#architecture类型的查询转换为类型之一hashTags.value:architecture or comments.hashTags.value:architecture尽管可能,这是非常不灵活的.如果我想出另一个包含主题标签的字段怎么办?我也必须把它包括在内.
有没有一般的方法来做到这一点?
PS请记住,我正在搜索的根类型是Post,因为这是我想要实现的结果
如何在使用Spring Boot时提供Hibernate Search参数?
...
spring.datasource.driverClassName=org.postgresql.Driver
hibernate.search.jmx_enabled=true
hibernate.search.default.directory_provider=filesystem
hibernate.search.generate_statistics=true
hibernate.search.lucene_version=LUCENE_CURRENT
hibernate.search.default.indexBase=/mypath-to-index
Run Code Online (Sandbox Code Playgroud)
它并不关心我提供的内容.始终应用默认设置.
我认为下面的代码没有任何东西来处理与Hibernate Search相关的属性.这可能是问题吗?
我正在使用Hibernate全文搜索.我目前正在使用:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search</artifactId>
<version>4.5.1.Final</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我可以搜索好了.我的问题是:我如何对结果进行分页?有什么方法我可以先得到50个结果,然后在接下来的50个结果请求下一页时拨打电话吗?
我想到的一种方法是简单地获取最大ID,然后从Max + 1位置开始下一次搜索,假设ID是以自动增量顺序生成的.但我认为必须有更优雅的方法.
问题:我们如何使用包含数字和非数字字段的原始lucene查询字符串提供hibernate搜索?
背景:我们最近升级到HibernateSearch 5.0,由于HibernateSearch Query Parser(pre-lucene)发生了更改,我们的许多查询现在都失败了,并出现以下错误:
The specified query contains a string based sub query which targets the numeric encoded field(s)
在大多数情况下,MultiFieldQueryParser由于我们运行的查询的复杂性,我们使用lucene的文本语法和a 将查询传递给HibernateSearch.直到HibernateSearch 5.0,这些都运行良好.在升级中,我们遇到了从HibernateSearch抛出的异常,这些异常阻止我们的应用程序运行以前的查询.我们不明白为什么抛出异常或者是向前推进的最佳方式.
在试图追踪问题时,我试图简化哪些有效,哪些无法以最原始的形式进行.(这是由HibernateSearch的QueryValidationTest构建的).
例子:
给定以下Entity类:
@Entity
@Indexed
public static class B {
@Id
@GeneratedValue
private long id;
@Field
private long value;
@Field
private String text;
}
Run Code Online (Sandbox Code Playgroud)
测试1(我们如何为hibernate搜索编写查询:FAILURE):
QueryParser parser = new MultiFieldQueryParser(new String[]{"id","value","num"},new StandardAnalyzer());
Query query = parser.parse("+(value:1 text:test)");
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( query, B.class );
fullTextQuery.list();
Run Code Online (Sandbox Code Playgroud)
结果是:
org.hibernate.search.exception.SearchException: HSEARCH000233: The specified query …Run Code Online (Sandbox Code Playgroud) Hibernate在内存中搜索默认的infinispan配置存储索引,一旦关闭应用程序,就必须重新索引所有内容.
我读了infinispan文档,有一种方法可以将索引存储到infinispan文件存储中.在谷歌周围搜索后,我仍然不知道如何配置它.
我尝试将HibernateSearch从版本升级5.7.0.Alpha1到版本5.7.1.Final,但这是不可能的.运行使用该Final版本编译的应用程序时出现以下错误:
Exception in thread "main" org.hibernate.search.exception.SearchException:
HSEARCH400024: Timed out while waiting for for index
'com.example.app.model.journal' to reach status 'green';
status was still 'yellow' after 10000ms.
Run Code Online (Sandbox Code Playgroud)
索引状态yellow在我的设置中是典型的(我认为).我的整个群集状态是yellow,因为它是ElasticSearch的单机部署(用于测试目的).所以我想阻止HibernateSearch等待green状态并强制它接受它yellow(之前的版本没有这样做).我可以设置一些设置,例如hibernate.cfg.xml吗?
我在开发者论坛上发现了这个问题,但是没有人提到设置名称.
我们正在针对Elasticsearch 5.6.6服务器使用Hibernate Search 5.10.3.Final。
直接发布FullTextQueries时,我们的应用程序与ES之间的连接似乎很牢固,也许b / c HibernateSearch具有一些内置的重试方法,但是我不确定,但是,在我们的应用程序中,我们使用Elasticsearch的RestClient发出直接调用。 _analyze,这是connection reset by peer我们的防火墙在30分钟后关闭空闲连接时得到的IOException。
java.io.IOException: Connection reset by peer
at sun.nio.ch.FileDispatcherImpl.read0(Native Method) ~[?:1.8.0_131]
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39) ~[?:1.8.0_131]
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) ~[?:1.8.0_131]
at sun.nio.ch.IOUtil.read(IOUtil.java:197) ~[?:1.8.0_131]
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380) ~[?:1.8.0_131]
at org.apache.http.impl.nio.reactor.SessionInputBufferImpl.fill(SessionInputBufferImpl.java:204) ~[httpcore-nio-4.4.5.jar:4.4.5]
at org.apache.http.impl.nio.codecs.AbstractMessageParser.fillBuffer(AbstractMessageParser.java:136) ~[httpcore-nio-4.4.5.jar:4.4.5]
at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:241) ~[httpcore-nio-4.4.5.jar:4.4.5]
at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81) ~[httpasyncclient-4.1.2.jar:4.1.2]
at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39) ~[httpasyncclient-4.1.2.jar:4.1.2]
at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114) ~[httpcore-nio-4.4.5.jar:4.4.5]
at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162) ~[httpcore-nio-4.4.5.jar:4.4.5]
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337) ~[httpcore-nio-4.4.5.jar:4.4.5]
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315) ~[httpcore-nio-4.4.5.jar:4.4.5]
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276) ~[httpcore-nio-4.4.5.jar:4.4.5]
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104) ~[httpcore-nio-4.4.5.jar:4.4.5]
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:588) ~[httpcore-nio-4.4.5.jar:4.4.5]
at java.lang.Thread.run(Thread.java:748) ~[?:1.8.0_131]
Run Code Online (Sandbox Code Playgroud)
为了完整起见,这是我们大多数的RestClient代码:
SearchFactory searchFactory = fts.getSearchFactory();
IndexFamily …Run Code Online (Sandbox Code Playgroud) hibernate-search ×10
java ×5
hibernate ×3
lucene ×2
spring-boot ×2
analyzer ×1
hashtag ×1
infinispan ×1
java-ee ×1
pagination ×1
search ×1
spring ×1