【问题标题】:What Lucene analyzer should I use if I want to allow all characters in a string?如果我想允许字符串中的所有字符,我应该使用什么 Lucene 分析器?
【发布时间】:2012-11-07 08:46:32
【问题描述】:

我正在创建一个字典应用程序,它可以搜索单词及其定义(两个单独的 Fields)。但是,使用StandardAnalyzer,当搜索字符串包含空格或特殊字符时,不会返回搜索结果。

例如,在我的虚拟字典数据中,搜索“lorem”会搜索其定义中包含“lorem”的所有单词,但搜索“lorem ipsum”不会返回任何结果,即使我的大多数虚拟单词在定义。

此外,搜索“make-believe”之类的词只会在键入“make”时返回结果,但只要我包含破折号,就不会返回任何内容。

我想包含空格、破折号、逗号等字符——基本上是搜索字符串中的所有字符(除了“and”、“at”、“by”等无意义的词之外),但是什么分析器我应该使用吗?我试过PatternAnalyzer 并提供.+ 作为Pattern 来查找,但即使只输入一个字母也不会返回任何内容。

【问题讨论】:

    标签: java string search lucene


    【解决方案1】:

    我坚持使用StandardAnalyzer,因为似乎没有其他选择。我所做的是通过捕获非单词字符的正则表达式对字符串进行标记,将它们组合在 AND BooleanQuery 中,并将两个 Fields 的查询组合在另一个 OR BooleanQuery 中。

    在下面的代码中,entry 是单词,description 是定义,s 是搜索字符串 CharSequence

    BooleanQuery bq = new BooleanQuery();
    BooleanQuery entryBQ = new BooleanQuery();
    BooleanQuery descriptionBQ = new BooleanQuery();
    String[] tokens = String.valueOf(s).split("[^a-zA-Z0-9]");
    for (String token : tokens) {
        if (token.isEmpty()) continue;
        entryBQ.add(new WildcardQuery(new Term("entry", token + "*")), BooleanClause.Occur.MUST);
        descriptionBQ.add(new WildcardQuery(new Term("description", token + "*")), BooleanClause.Occur.MUST);
    }
    bq.add(entryBQ, BooleanClause.Occur.SHOULD);
    bq.add(descriptionBQ, BooleanClause.Occur.SHOULD);
    TopScoreDocCollector collector = TopScoreDocCollector.create(10, true);
    is.search(bq, collector);
    

    这在我的 Android 应用程序中现在非常慢,但我可以稍后对其进行优化。 :)

    【讨论】:

      【解决方案2】:

      我会认真考虑编写自己的分析器,但我知道这比使用现有分析器更难。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-19
        • 2018-09-24
        • 2021-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多