首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MultiFieldQueryParser对特定术语进行通配符搜索

使用MultiFieldQueryParser对特定术语进行通配符搜索
EN

Stack Overflow用户
提问于 2013-01-03 21:28:23
回答 1查看 771关注 0票数 0

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

  • TransactionId
  • 代理
  • 放款人

我的要求是:

  1. 如果搜索词与文档的TransactionId.值的第一部分匹配,我想要一次点击例如,如果我搜索"ab“,那么TransactionId等于"ab-1”或"ab-2“的文档就会被点击。
  2. 我只想点击时,完整的搜索条件匹配代理贷款人。对"ab“的搜索不会返回贷款人价值为"ab-1”或"ab-2“的文件。

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

代码语言:javascript
复制
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来完成吗?

EN

回答 1

Stack Overflow用户

发布于 2013-01-04 05:24:14

您可能可以通过子类MultiFieldQueryParser来实现这一点。

下面的内容似乎很有效,也许你可以在此基础上构建一些东西。注意,解析BooleanQuery应该是递归的,因为最终可能会出现嵌套查询。

免责声明:这段代码并不优雅,很可能很容易中断,其目的是作为一个快速示例

代码语言:javascript
复制
    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;
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14147558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档