【问题标题】:Hibernate search exact match for strings with dashes休眠搜索与破折号的字符串完全匹配
【发布时间】:2017-11-27 11:09:22
【问题描述】:

我想对具有“xx-xx-xx”格式的实体字段进行精确搜索。

实体如下所示:

@Entity
@Indexed
class Resource {

    @Field
    private String address; // has "xx-xx-xx" format
}

查询创建过程如下: queryBuilder.keyword().onFields("resource").matching(searchQuery).createQuery()

假设我有两个资源,地址如下:

aa-bb-cc
cc-dd-ee

当我运行搜索查询 "aa-bb-cc" 时,我希望只返回第一个资源,但相反,我让搜索返回两个资源。

我应该改变什么并按资源字段进行精确搜索?

【问题讨论】:

  • 也许像.setMaxResults(1) 这样的东西会起作用
  • @XtremeBaumer,这个问题与索引/分析问题更相关。请参阅下面的答案以获得更好的洞察力。

标签: java hibernate hibernate-search


【解决方案1】:

您需要禁用此字段的默认分析器,以便将其视为“精确”关键字:

@Entity
@Indexed
class Resource {

    @Field(analyze=Analyze.NO)
    private String address; // has "xx-xx-xx" format
}

【讨论】:

  • 没错。 @ilya-zinkovich 您的查询匹配两个结果的原因是,由于分析,值被标记化('aa-bb-cc' 被翻译成三个值:'aa'、'bb' 和 'cc'),所以你的查询被翻译成类似“'aa' OR 'bb' OR 'cc'”的东西,这显然会匹配两个实体(都包含'cc')。在您的情况下,删除分析(或至少标记化)应该可以解决问题。
  • 非常感谢。这是我最初的想法,但我担心禁用分析器可能带来的其他后果。
猜你喜欢
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2020-06-23
相关资源
最近更新 更多