我正在使用 MultiFieldQueryParser 来解析 aa、bb 等字符串但是在解析之后,它会删除字符串中的点。我在这里想念什么?
谢谢。
我不确定 MultiFieldQueryParser 是否按照您的想法执行。另外...我不确定我知道您要做什么。
我确实知道,对于任何查询解析器,像“aa”和“bb”这样的字符串都会去掉句点,因为至少在默认的分析器中,所有标点符号都被视为空格。
就 MultiFieldQueryParser 而言,这只是一个允许您指定多个默认字段进行搜索的 QueryParser。所以用查询
标题:“人鼠之间”“约翰·斯坦贝克”
将在所有默认字段中查找字符串“John Steinbeck”,而仅在标题字段中搜索“Of Mice and Men”。
您的解析器使用什么分析器?如果它是 StopAnalyzer,那么该点可能是一个停用词,因此被忽略。如果它是清理输入(包括删除点)的 StandardAnalyzer,也是如此。
(重复我从骗子的回答。应该删除其中之一)。
专门处理首StandardAnalyzer
字母缩略词,并将 CFA(例如)转换为 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 主机名,因此搜索“CFA”将不会匹配文本中的“CFA”。