Hibernate搜索和Elastic Search分析器进行精确搜索

时间:2019-07-15 10:45:17

标签: java hibernate elasticsearch hibernate-search

我在实体字段上方有StandardAnalyser

 @Field(name = "myField", index = Index.YES, analyze = Analyze.YES, analyzer = @Analyzer(impl = StandardAnalyzer.class)),

但是我不知道该如何实现:

1)通过类似以下内容的词进行搜索:我喜欢香蕉-> [“ I”,“ like”,“ bananas”](分析仪当前允许我这样做)

2)通过精确的输入进行搜索:“我喜欢香蕉”->“我喜欢香蕉”(StandardAnalyser不允许,并且适合的更改是impl = KeywordAnalyser)

我应该基于输入(如果它以双引号开头和结尾)更改分析器,或者更改为Java代码,更改搜索方式吗?

致谢

1 个答案:

答案 0 :(得分:0)

也许您想查询短语?词组查询会查找一系列标记,而不只是一个标记。

Query luceneQuery = queryBuilder.phrase()
    .onField("myField")
    .sentence("I like bananas")
    .createQuery();

请参见https://docs.jboss.org/hibernate/search/5.11/reference/en-US/html_single/#_phrase_queries

但是,短语查询仍然有点“模糊”,因为分析器仍然参与其中:大小写将被忽略,等等。它只是在寻找一系列(已分析的)令牌。

如果您确实需要精确的搜索(包括区分大小写),则只需声明两个字段即可:

 @Field(name = "myField", index = Index.YES, analyze = Analyze.YES, analyzer = @Analyzer(impl = StandardAnalyzer.class))
 @Field(name = "myField_exact", index = Index.YES, analyze = Analyze.NO)

然后,您可以根据需要在查询时定位myFieldmyField_exact

当然,您需要在myField_exact可用之前重新索引数据。