【问题标题】:Using MultiFieldQueryParser使用 MultiFieldQueryParser
【发布时间】:2009-03-17 03:40:15
【问题描述】:

我正在使用 MultiFieldQueryParser 来解析 a.a.、b.b. 等字符串 但是在解析之后,它会删除字符串中的点。 我在这里错过了什么?

谢谢。

【问题讨论】:

  • 如果你能提供更多关于你想要做什么的信息,我可以进一步帮助你。
  • 正在使用 Lucene 开发图书搜索 api。用户可以搜索标题或描述字段包含 C.F.A 的图书...这些信息是否足够?

标签: lucene lucene.net


【解决方案1】:

我不确定 MultiFieldQueryParser 是否符合您的预期。另外...我不确定我是否知道您要做什么。

我确实知道,对于任何查询解析器,像“a.a.”这样的字符串和'b.b.'将删除句点,因为至少在默认分析器中,所有标点符号都被视为空格。

就 MultiFieldQueryParser 而言,这只是一个 QueryParser,它允许您指定多个默认字段进行搜索。所以用查询

标题:“人鼠之间”“约翰·斯坦贝克”

将在您的所有默认字段中查找字符串“John Steinbeck”,而仅在标题字段中查找“Of Mice and Men”。

【讨论】:

    【解决方案2】:

    您的解析器使用什么分析器?如果它是 StopAnalyzer,则该点可能是停用词,因此被忽略。如果是清理输入(包括删除点)的 StandardAnalyzer,也是一样。

    【讨论】:

    • 感谢您的输入...我正在使用 StandardAnalyzer 以及停用词列表...我的停用词列表没有“。”在里面。
    【解决方案3】:

    (重复我对the dupe的回答。应该删除其中一个)。

    StandardAnalyzer 专门处理首字母缩略词,并将 C.F.A. (例如)到 cfa。这意味着您应该能够进行搜索,只要您确保使用相同的分析器进行索引和查询解析。

    我建议您运行一些更基本的测试用例以消除其他因素。尝试使用普通的QueryParser 而不是多字段。

    这是我写的一些代码来玩StandardAnalyzer

    StringReader testReader = new StringReader("C.F.A. C.F.A word");
    StandardAnalyzer analyzer = new StandardAnalyzer();
    TokenStream tokenStream = analyzer.tokenStream("title", testReader);
    System.out.println(tokenStream.next());
    System.out.println(tokenStream.next());
    System.out.println(tokenStream.next());
    

    顺便说一句,这个输出是:

    (cfa,0,6,type=<ACRONYM>)
    (c.f.a,7,12,type=<HOST>)
    (word,13,17,type=<ALPHANUM>)
    

    请注意,例如,如果首字母缩略词不以点结尾,则分析器会假定它是 Internet 主机名,因此搜索“C.F.A”将不会匹配“C.F.A”。在正文中。

    【讨论】:

      猜你喜欢
      • 2012-02-09
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      相关资源
      最近更新 更多