0

Lucene.net バージョン 3.0 API を利用して、プロジェクトのインデックスを作成および検索しています。インデックス内の各ドキュメントには 3 つのフィールドがあります。

  • 取引ID
  • エージェント
  • 貸し手

私の要件はこれです:

  1. 検索語が Document のTransactionIdの値の最初の部分と一致する場合にヒットが必要です。たとえば、「ab」を検索すると、「ab-1」または「ab-2」に等しいTransactionIdを持つドキュメントがヒットします。

  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);

が「ab」の場合queryText、クエリの値は{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 に答える