0

我正在利用 Lucene.net 3.0 版 API 为我的项目创建和搜索索引。我的索引中的每个文档都有三个字段:

  • 交易 ID
  • 代理人
  • 贷方

我的要求是这样的:

  1. 如果搜索词与TransactionId的文档值的第一部分匹配,我想要一个命中。例如,如果我搜索“ab”,则TransactionId等于“ab-1”或“ab-2”的文档将被命中。

  2. 当完整的搜索词匹配AgentLender时,我只想要命中。搜索“ab”不会返回 Lender 值为“ab-1”或“ab-2”的文档。

到目前为止,我有以下代码块:

var searcher = new IndexSearcher(FSDirectory.Open(path));
var parser = new MultiFieldQueryParser(Version.LUCENE_30, 
 new[] {"TransactionId", "Agent", "Lender"},
 new StandardAnalyzer(Version.LUCENE_30));

var query = parser.Parse(queryText);
var hits = searcher.Search(query, 200);

如果queryText是 "ab" 那么查询的值是{TransactionId:ab Agent:ab Lender:ab}

我知道我正在寻找类似的东西{TransactionId:ab* Agent:ab Lender:ab}

有什么办法可以做到这一点MultiFieldQueryParser

4

1 回答 1

1

您可能可以通过继承MultiFieldQueryParser.

以下似乎可行,也许您可​​以在此基础上进行构建。请注意,解析 BooleanQuery 应该是递归的,因为您最终可能会遇到嵌套查询。

免责声明:这段代码并不优雅,可能很容易破坏,它的目的是作为一个简单的例子

    public class WildCardForFieldQueryParser : MultiFieldQueryParser
    {
        public WildCardForFieldQueryParser(Lucene.Net.Util.Version version, 
                                           string [] fields, 
                                           Analyzer analyzer, 
                                           HashSet<string> wildcardFields)
            :base(version, fields, analyzer)
        {
            this._wildcardFields = wildcardFields;
        }

        public override Query Parse(string query)
        {
            // clause replacement should be recursive
            Query q = base.Parse(query);
            if (q is BooleanQuery)
            {
                foreach (var clause in q as BooleanQuery)
                {
                    if (clause.Query is TermQuery && this._wildcardFields.Contains(((TermQuery)clause.Query).Term.Field))
                    {
                        clause.Query = new PrefixQuery(new Term(((TermQuery)clause.Query).Term.Field, ((TermQuery)clause.Query).Term.Text));
                    }
                }
            }
            return q;
        }
        private HashSet<string> _wildcardFields;
    }
于 2013-01-04T05:24:14.643 回答