Lucene - 如何修改查询对象的条款?

时间:2012-07-09 13:57:17

标签: lucene lucene.net

我想在基于Lucene的搜索引擎网站上添加新字段,但是我希望能够在将查询传递给搜索者之前拦截查询并对其进行修改。

例如,每个文档都有字段userid,因此您可以搜索特定用户根据其ID创作的文档,例如foo bar userid:123但是我想添加按用户名搜索的功能。

我想在查询中添加一个字段user:RonaldMcDonald到文档中),但我希望能够拦截该字词并将其替换为等效{{1 term(我自己的代码负责将“RonaldMcDonald”转换为“123”)。

这是我现在正在使用的简单代码:

userid:123

我已经查看了Query类,但我看不到任何方法来检索,删除或插入术语。

1 个答案:

答案 0 :(得分:2)

您可以继承QueryParser并覆盖NewTermQuery

QP qp = new QP("user", new SimpleAnalyzer());
var s = qp.Parse("user:RonaldMcDonald data:[aaa TO bbb]");

s的位置userid:123 data:[aaa TO bbb]

public class QP : QueryParser
{
    Dictionary<string, string> _dict = 
       new Dictionary<string, string>(new MyComparer()) {{"RonaldMcDonald","123"} };

    public QP(string field, Analyzer analyzer) : base(field, analyzer)
    {
    }

    protected override Query NewTermQuery(Term term)
    {
        if (term.Field() == "user")
        {
            //Do your username -> userid mapping
            return new TermQuery(new Term("userid", _dict[term.Text()]));
        }
        return base.NewTermQuery(term);
    }

    //Case insensitive comparer
    class MyComparer : IEqualityComparer<string>
    {
        public bool Equals(string x, string y)
        {
            return String.Compare(x, y, true, CultureInfo.InvariantCulture)==0;
        }

        public int GetHashCode(string obj)
        {
            return obj.ToLower(CultureInfo.InvariantCulture).GetHashCode();
        }
    }
}