我正在尝试使用Spring Data Rest和Hibernate Search为我的REST后端实现一个非常基本的搜索功能。我想允许用户通过将查询字符串传递给搜索函数来执行任意查询。为了能够更轻松地在本地运行后端并且避免不得不启动Elasticsearch来运行测试,我希望能够在这些情况下使用本地索引。
我的问题是,与Elasticsearch相比,以下代码使用本地索引无法产生相同的结果。我试图将以下代码限制为我认为相关的代码。
实体:
@Indexed(index = "MyEntity")
@AnalyzerDef(name = "ngram",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class ),
filters = {
@TokenFilterDef(factory = StandardFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = StopFilterFactory.class),
@TokenFilterDef(factory = NGramFilterFactory.class,
params = {
@Parameter(name = "minGramSize", value = "2"),
@Parameter(name = "maxGramSize", value = "3") } )
}
)
public class MyEntity {
@NotNull
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.YES, analyzer = @Analyzer(definition = "ngram"))
private String name;
@Field(analyze = Analyze.YES, store = Store.YES)
@FieldBridge(impl = StringCollectionFieldBridge.class)
@ElementCollection(fetch = FetchType.EAGER)
private Set<String> tags = new HashSet<>();
}
本地索引的application.yml:
spring:
jpa:
hibernate:
ddl-auto: update
show-sql: false
Elasticsearch的application.yml:
spring:
jpa:
hibernate:
ddl-auto: create-drop
properties:
hibernate:
search:
default:
indexmanager: elasticsearch
elasticsearch:
host: 127.0.0.1:9200
required_index_status: yellow
搜索端点:
private static String[] FIELDS = { "name", "tags" };
@Override
public List<MyEntity> querySearch(String queryString) throws ParseException {
QueryParser queryParser = new MultiFieldQueryParser(FIELDS, new SimpleAnalyzer());
queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
org.apache.lucene.search.Query query = queryParser.parse(queryString);
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(this.entityManager);
javax.persistence.Query persistenceQuery =
fullTextEntityManager.createFullTextQuery(query, MyEntity.class);
return persistenceQuery.getResultList();
}
我创建具有以下值的MyEntity实例:
$ curl 'localhost:8086/myentities'
{
"_embedded" : {
"myentities" : [ {
"name" : "Test Entity",
"tags" : [ "bar", "foobar", "foo" ],
"_links" : {
...
}
} ]
},
"_links" : {
...
}
}
以下查询使用Elasticsearch工作(返回该实体):
使用本地索引,我得到了“ tags:bar:的结果,但是对name字段的查询未返回结果。为何会出现这种情况?]
我正在尝试使用Spring Data Rest和Hibernate Search为我的REST后端实现一个非常基本的搜索功能。我想允许用户通过传递查询来执行任意查询...
您应确保由Hibernate Search正确创建了Elasticsearch映射。默认情况下,Hiberante Search仅在缺少映射时创建映射。