Hibernate搜索:Elasticsearch和Lucene产生不同的搜索结果

问题描述 投票:1回答:1

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

使用本地索引,我得到了“ tags:bar:的结果,但是对name字段的查询未返回结果。为何会出现这种情况?]

我正在尝试使用Spring Data Rest和Hibernate Search为我的REST后端实现一个非常基本的搜索功能。我想允许用户通过传递查询来执行任意查询...

elasticsearch lucene hibernate-search
1个回答
0
投票

您应确保由Hibernate Search正确创建了Elasticsearch映射。默认情况下,Hiberante Search仅在缺少映射时创建映射。

© www.soinside.com 2019 - 2024. All rights reserved.