【问题标题】:how to properly escape a lucene query?如何正确转义 lucene 查询?
【发布时间】:2012-06-22 09:23:31
【问题描述】:

我对 Lucene 还很陌生,最近遇到了一个问题。我有一个看起来像这样的 lucene 文档:

--- type ---
gene
--- id ---
xla:379474
--- alt_id ---
emb:BC054227
gb:BC054227
ncbi-geneid:379474
ncbi-gi:148230166
rs:NM_001086315
rs:NP_001079784
unigene:Xl.24622
xla:379474

我创建了下面的查询以检索该文档。它适用于altId = 379474,但不适用于altId = ncbi-geneid:379474Xl.24622。我猜想 altId 必须被转义并尝试String altId = QueryParser.escape(altId),但没有运气。这是查询的预期行为吗?我错过了什么?

Query query1 = new TermQuery(new Term("type", "gene"));
Query query2 = new TermQuery(new Term("alt_Id", altId));

BooleanQuery query = new BooleanQuery();
query.add(query1, BooleanClause.Occur.MUST);
query.add(query2, BooleanClause.Occur.MUST);

顺便说一下,我正在运行 lucene v3.0。

【问题讨论】:

    标签: java lucene escaping


    【解决方案1】:

    这应该对您有所帮助。 试着让我知道。 http://www.strongd.net/?p=44

    【讨论】:

    • 正如我所说,我尝试使用查询解析器 (QueryParser.escape(altId)) 转义查询,但没有成功。我还尝试了link 中提出的模式替代方案,我可以看到用户输入被转义了alt_id:xla\:379474,但在运行查询时仍然没有得到任何结果。
    【解决方案2】:

    原来问题与转义无关,而是与alt_id 的索引方式和TermQuery 的使用有关。有两种可能的解决方案:

    1. QueryParser.parse 的输出替换TermQuery,用QueryParser 创建StandardAnalyzer
    2. 或将alt_id 索引为Index.NOT_ANALYZED 并坚持使用TermQuery

    我实现了最后一个,效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多