【问题标题】:Lucene .Net term query with special character具有特殊字符的 Lucene .Net 术语查询
【发布时间】:2014-08-01 09:27:54
【问题描述】:

我正在搜索与短语完全匹配的项目。经过研究,我认为最好的方法是将字段设置为NOT_ANALYSED 并执行TermQuery

这很好用,但是当一个词有特殊字符时,例如“/”,没有结果。我可以使用 Luke 看到该字段包含该字符。我这样构建我的查询。

BooleanQuery filterQuery = new BooleanQuery();
filterQuery.Add(new TermQuery(new Lucene.Net.Index.Term(customFieldFilter.Name, val)), Occur.MUST);
booleanQuery.Add(filterQuery, Occur.MUST);

最终查询如下所示:

{+Type:Person +(+Expertise:Customer Care/Account Management)}

API 提到“/”是一个特殊字符,所以我试图转义它

val = val.Replace("/", "\\/"); 
{+Type:Person +(+Expertise:Customer Care\/Account Management)}

但是仍然没有结果。没有特殊字符的搜索很好,我需要更改什么?

【问题讨论】:

    标签: c# .net lucene


    【解决方案1】:

    不确定 C#,但在 Java Lucene 中,正斜杠 (/) 是 not a special character。然而,反斜杠 (\) 是。

    您对代码所做的是使用转义斜线来转义不需要转义的符号。这应该与初始代码没有区别,因此您得到的结果。

    要全面回答您的问题,如果您能准确地展示您是如何索引文本的,将会有所帮助。一个简短的、独立的例子来说明这个问题是理想的。

    【讨论】:

    • 谢谢你的回答,我实际上已经设法让它工作,现在将发布答案。很抱歉没有包含索引代码 - 我对 Lucene 还很陌生,并没有意识到这是重要的方面。
    【解决方案2】:

    我一直想要一个完全匹配的搜索类型,所以做了一个词组查询

    PhraseQuery query = new PhraseQuery();
    query.Add(new Term(customFieldFilter.Name, val));
    booleanQuery.Add(query, Occur.MUST);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 2013-10-12
      • 1970-01-01
      • 2011-10-24
      相关资源
      最近更新 更多