Lucene 文本搜索以非字母结尾的名称失败
Posted
技术标签:
【中文标题】Lucene 文本搜索以非字母结尾的名称失败【英文标题】:Lucene text search failing for names ending with a non-alphabet 【发布时间】:2012-11-22 01:54:24 【问题描述】:在我的 Webmethods 应用程序中,我需要实现一个搜索功能,并且我已经使用 Lucene 完成了它。但是,当我搜索标题以 alpabet.for 以外的文件结尾的文件时,搜索不会检索结果,例如:- doc1.txt 或 new$.txt 在下面的代码中,当我尝试 print queryCmbd 它的打印搜索结果>>>>>>>title:"doc1 txt" (contents:doc1 contents:txt).when 我搜索类似的字符串时doc.txt,结果是搜索结果>>>>>>>title:"doc.txt" contents:doc.txt。为了解析这些类型的字符串(如 doc1.txt、new$.txt)应该怎么做?
public java.util.ArrayList<DocNames> searchIndex(String querystr,
String path, StandardAnalyzer analyzer)
String FIELD_CONTENTS = "contents";
String FIELD_TITLE = "title";
String queryStringCmbd = null;
queryStringCmbd = new String();
String queryFinal = new String(querystr.replaceAll(" ", " AND "));
queryStringCmbd = FIELD_TITLE + ":\"" + queryFinal + "\" OR "
+ queryFinal;
try
FSDirectory directory = FSDirectory.open(new File(path));
Query q = new QueryParser(Version.LUCENE_36, FIELD_CONTENTS,
analyzer).parse(querystr);
Query queryCmbd = new QueryParser(Version.LUCENE_36,
FIELD_CONTENTS, analyzer).parse(queryStringCmbd);
int hitsPerPage = 10;
IndexReader indexReader = IndexReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
TopScoreDocCollector collector = TopScoreDocCollector.create(
hitsPerPage, true);
indexSearcher.search(queryCmbd, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
System.out
.println("Search Results>>>>>>>>>>>>"
+ queryCmbd);
docNames = new ArrayList<DocNames>();
for (int i = 0; i < hits.length; ++i)
int docId = hits[i].doc;
Document d = indexSearcher.doc(docId);
DocNames doc = new DocNames();
doc.setIndex(i + 1);
doc.setDocName(d.get("title"));
doc.setDocPath(d.get("path"));
if (!(d.get("path").contains("indexDirectory")))
docNames.add(doc);
indexReader.flush();
indexReader.close();
indexSearcher.close();
return docNames;
catch (CorruptIndexException e)
closeIndex(analyzer);
e.printStackTrace();
return null;
catch (IOException e)
closeIndex(analyzer);
e.printStackTrace();
return null;
catch (ParseException e)
closeIndex(analyzer);
e.printStackTrace();
return null;
【问题讨论】:
【参考方案1】:您的问题来自您使用StandardAnalyzer
的事实。如果您阅读它的javadoc,它会告诉您它正在使用StandardTokenizer
进行令牌拆分。这意味着像doc1.txt
这样的短语将被拆分为doc1
和txt
。
如果要匹配整个文本,则需要使用KeywordAnalyzer
- 同时用于索引和搜索。下面的代码显示了不同之处:使用StandardAnalyzer
标记是"doc1", "txt"
,使用KeywordAnalyzer
唯一标记是doc1.txt
。
String foo = "foo:doc1.txt";
StandardAnalyzer sa = new StandardAnalyzer(Version.LUCENE_34);
TokenStream tokenStream = sa.tokenStream("foo", new StringReader(foo));
while (tokenStream.incrementToken())
System.out.println(tokenStream.getAttribute(TermAttribute.class).term());
System.out.println("-------------");
KeywordAnalyzer ka = new KeywordAnalyzer();
TokenStream tokenStream2 = ka.tokenStream("foo", new StringReader(foo));
while (tokenStream2.incrementToken())
System.out.println(tokenStream2.getAttribute(TermAttribute.class).term());
【讨论】:
谢谢,真的很管用!但是我们是否可以使用 KeywordAnalyzer 来查找具有“X X X X X X X X X X X X”之类的内容的文件,或者在搜索字符串包含空格的情况下?我试过但没有得到结果?在这种情况下可以做什么?请帮忙 您需要提供更多详细信息,最好的办法是打开一个新问题并显示代码。另外,如果这个答案有帮助,您可能想接受它,否则人们将停止为您提供答案。以上是关于Lucene 文本搜索以非字母结尾的名称失败的主要内容,如果未能解决你的问题,请参考以下文章