Hibernate Search (Lucene) return 如果字符串中的 '=' 为空结果
Hibernate Search (Lucene) return empty result in case of '=' in string
我将 Lucene 配置为按 test
列中的值搜索我的 Hibernate 模型:
@Entity
@Table(name = "TEST")
@Audited
@Indexed
public class Test {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
@Column(name = "TEST")
@Field(index = Index.YES,analyze = Analyze.YES,store = Store.NO)
private String test;
...
}
在数据库测试模型中包含以下测试列值:
- AB=ABC
- AB=BCD
我创建了以下用于按列值搜索的代码:
String queryValue = "AB";
QueryBuilder qb = org.hibernate.search.jpa.Search.getFullTextEntityManager(em).getSearchFactory().buildQueryBuilder().forEntity(Test.class).get();
Query query = qb.all().createQuery();
BooleanJunction<BooleanJunction> conjuction = qb.bool();
String searchValue = new StringBuilder().append("*").append(queryValue .toLowerCase()).append("*").toString();
conjuction.should(qb.keyword().wildcard().onFields(new String[] { "test"}).matching(searchValue).createQuery());
query = conjuction.createQuery();
FullTextQuery textQuery = org.hibernate.search.jpa.Search.getFullTextEntityManager(em).createFullTextQuery(query, Test.class);
return textQuery.getResultList();
以上代码可以找到值 AB
和 Lucene return 我的 2 条记录,但是当我寻找 AB=
时,它 return 是我的空结果。
更新
这是索引代码:
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
fullTextEntityManager.createIndexer().startAndWait();
你知道为什么我得到空结果吗,因为 Lucen 应该 return 我 2 条记录?我该如何解决?
默认使用的分析器是StandardAnalyzer
https://docs.jboss.org/hibernate/search/5.3/reference/en-US/html_single/#analyzer
standaranalyzer 在 =
上拆分标记并从生成的标记中也删除 =
。
因此在您索引 AB=ABC
时,会创建以下标记。
AB, ABC
这就是为什么当您搜索 *AB*
时会得到结果
但是当您搜索 *AB=*
时,您找不到任何东西,因为没有这样的标记。
我将 Lucene 配置为按 test
列中的值搜索我的 Hibernate 模型:
@Entity
@Table(name = "TEST")
@Audited
@Indexed
public class Test {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
@Column(name = "TEST")
@Field(index = Index.YES,analyze = Analyze.YES,store = Store.NO)
private String test;
...
}
在数据库测试模型中包含以下测试列值:
- AB=ABC
- AB=BCD
我创建了以下用于按列值搜索的代码:
String queryValue = "AB";
QueryBuilder qb = org.hibernate.search.jpa.Search.getFullTextEntityManager(em).getSearchFactory().buildQueryBuilder().forEntity(Test.class).get();
Query query = qb.all().createQuery();
BooleanJunction<BooleanJunction> conjuction = qb.bool();
String searchValue = new StringBuilder().append("*").append(queryValue .toLowerCase()).append("*").toString();
conjuction.should(qb.keyword().wildcard().onFields(new String[] { "test"}).matching(searchValue).createQuery());
query = conjuction.createQuery();
FullTextQuery textQuery = org.hibernate.search.jpa.Search.getFullTextEntityManager(em).createFullTextQuery(query, Test.class);
return textQuery.getResultList();
以上代码可以找到值 AB
和 Lucene return 我的 2 条记录,但是当我寻找 AB=
时,它 return 是我的空结果。
更新
这是索引代码:
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
fullTextEntityManager.createIndexer().startAndWait();
你知道为什么我得到空结果吗,因为 Lucen 应该 return 我 2 条记录?我该如何解决?
默认使用的分析器是StandardAnalyzer https://docs.jboss.org/hibernate/search/5.3/reference/en-US/html_single/#analyzer
standaranalyzer 在 =
上拆分标记并从生成的标记中也删除 =
。
因此在您索引 AB=ABC
时,会创建以下标记。
AB, ABC
这就是为什么当您搜索 *AB*
时会得到结果
但是当您搜索 *AB=*
时,您找不到任何东西,因为没有这样的标记。