代码之家  ›  专栏  ›  技术社区  ›  JamieGaines

如何在Lucene.NET中进行部分单词搜索?

  •  9
  • JamieGaines  · 技术社区  · 16 年前

    我有一个相对较小的索引,包含大约4000个位置。除此之外,我正在使用它填充搜索表单上的自动完成字段。

    • 俄亥俄州
    • 俄亥俄州都柏林
    • 哥伦布,俄亥俄州

    我希望能够输入“ohi”并显示所有这些结果,现在什么都不会显示,直到我输入完整的单词“ohio”。

    BooleanQuery keywords = new BooleanQuery();
    QueryParser parser = new QueryParser("location", new StandardAnalyzer());
    parser.SetAllowLeadingWildcard(true);
    keywords.Add(parser.Parse("\"*" + location + "*\""), BooleanClause.Occur.SHOULD);
    luceneQuery.Add(keywords, BooleanClause.Occur.MUST);
    

    简而言之,我想让它像一个类似于

    SELECT * from Location where Name LIKE '%ohi%'
    

    我能和Lucene一起做这个吗?

    3 回复  |  直到 16 年前
        1
  •  13
  •   rae1    13 年前

    请尝试以下查询:

    parser.Parse(query.Keywords.ToLower() + "*")
    
        2
  •  1
  •   Shashikant Kore    16 年前

    是的,这是可以做到的。但是,前导通配符可能会导致查询速度变慢。检查 documentation . 此外,如果将整个字符串(例如“Dayton,Ohio”)作为单个标记进行索引,则大多数查询将退化为前导前缀查询。使用像StandardAnalyzer这样的标记器(我想您已经在这么做了)将减少对前导通配符的要求。

    如果出于性能原因不需要前导前缀,可以尝试索引NGRAM。这样,就不会有任何前导通配符查询。ngram(假设长度仅为4)标记器将为“Dayton Ohio”创建标记,如“dayt”、“ayto”、“yton”等。

        3
  •  0
  •   Zac Bowling    16 年前

    更重要的是,首先要用部分单词填充索引。您的分析器需要在分析时将部分关键字放入索引中(希望权重低于完整关键字)。

    lucene索引查找树从左到右运行。如果你想在关键词的中间搜索,你在分析的时候已经把它分解了。问题是,部分关键字通常会爆炸索引大小。

    推荐文章