【问题标题】:How to use Hibernate Analyzer?如何使用休眠分析器?
【发布时间】:2013-08-14 16:41:00
【问题描述】:

我正在尝试在我的休眠查询中搜索特殊字符,我使用 QueryParser.escape(String searchTerm) 在所有特殊字符前面放置一个“\”字符以正确转义它们。

但是我发现用于标记化的标准分析器会从索引中删除这些特殊字符,因此即使您正确地转义了术语“abc-def”,如果您尝试搜索它,您也必须搜索“abc def” '。

那么我应该使用什么分析器/我应该如何指定分析器在索引时不删除特殊字符?

我的注释类和查询构建的 sn-p 如下:

@Entity
@Table(name="jobReq")
@Indexed
public class JobReq {

@Id
@DocumentId
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

@Field
@Column(name="jobId", nullable=false, unique=true)
private String jobId;

@Fields({@Field, @Field(name = "jobIdSort", analyze = Analyze.NO)})
@Column(name="jobIdSort", nullable=false, unique=true)
private String jobIdSort;

@Field
@Column(name="jobTitle", nullable=false)
private String jobTitle;

查询:

tempQ = (org.apache.lucene.search.Query) qb.keyword()
                                .wildcard()
                                .onField(allFields[i].getName().toString())
                                .matching(QueryParser.escape(termToFind) + "*")
                                .createQuery();
                    }   
                    bq.add(new BooleanClause(tempQ, BooleanClause.Occur.SHOULD));
                }
            }
        }
        //wrap Lucene query in an org.hibernate.Query
        hibQuery = fullTextSession.createFullTextQuery(bq, this.type).setSort(sort);
        results = hibQuery.list();
        System.out.println(bq);
        fullTextSession.getTransaction().commit();

【问题讨论】:

  • 你见过其他类似的问题吗,比如:stackoverflow.com/questions/3006524/…
  • 我通过调用 QueryParser.escape() 来使用转义字符,它可以正确地转义查询,但是在数据库中标记数据的方式会从索引中删除特殊字符,所以它不是可搜索。我尝试使用 KeywordAnalyzer @Analyzer(impl = KeywordAnalyzer.class) @Field() @Column(name="jobId", nullable=false, unique=true) private String jobId; 但它在我的搜索中没有返回任何内容。此外,我没有使用字符串“手动”构建查询。

标签: hibernate lucene escaping character hibernate-search


【解决方案1】:

在这种情况下,我认为使用QueryParser.escape 没有任何意义。这旨在转义字符串形式的查询以准备解析。您没有使用QueryParser,并且已在 cmets 中声明您不打算使用。您提到您已经尝试过关键字分析器。我怀疑那里的问题是您通过QueryParser.escape 方法运行它,并且在该上下文中添加了一个无关的反斜杠,从而阻止找到匹配项。


如果您倾向于改用 QueryParser 并利用分析,您可能会创建如下内容:

SearchFactory searchFactory = fullTextSession.getSearchFactory();
org.apache.lucene.queryParser.QueryParser parser = new QueryParser(defaultField, searchFactory.getAnalyzer(JobReq.class) );
/* 
 create your BooleanQuery, loop, whatever else
*/
    org.apache.lucene.search.Query query = parser.parse( allFields[i].getName().toString() + ":" + QueryParser.escape(termToFind) + "*" );
    bq.add(new BooleanClause(tempQ, BooleanClause.Occur.SHOULD));

hibQuery = fullTextSession.createFullTextQuery(bq).setSort(sort);
results = hibQuery.list();

【讨论】:

  • 我尝试使用 KeywordAnalyzer 并没有在带注释的类中指定分析器(我认为它使用 scopeAnalyzer?),还尝试了与 QueryParser 中的不同组合,但它仍然不会t 返回格式为“abc-def”的结果
  • 是的,也试过没有转义。就像这个值甚至没有被索引一样,就像我只是对“abc-def”这个词进行简单的搜索时,当我第一次开始并且只有一个基本的搜索查询时,它也没有出现我可以搜索“abc*”甚至“abc def”(空格替换特殊字符),它会显示出来
  • ab* 没有产生任何点击似乎很奇怪。您是否查看了生成的最终布尔查询 (Query.toString()) 以确保它看起来像您期望的那样?
  • 是的,它似乎是正确的:jobId:nou-335573 jobTitle:nou-335573 contract:nou-335573 project:nou-335573 laborCategory:nou-335573 summary:nou-335573 jobDescription:nou-335573 status:nou-335573 TTONumber:nou-335573 TTONumber:nou-335573 TTONumber:nou-335573 requiredSkills:nou-335573 jobId:nou-335573 是我目前使用关键字分析器设置的字段 'jobId' 并且没有转义,尽管当它被正确转义时,我查看了它并且确实有`` 插入它们应该在的位置。我感觉它的索引设置不正确。
  • 天哪,我刚刚开始使用查询字符串 (jobId:nwb jobId:528864),我猜括号很重要。感谢您的帮助!
猜你喜欢
  • 2012-01-15
  • 2017-04-17
  • 2023-03-06
  • 1970-01-01
  • 2011-06-11
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
相关资源
最近更新 更多