[lucene] 怎么搜索一串数字?问题解决,不优雅....

xajhzc 2009-09-14
索引的时候就没有分词,直接存储
现在检索的时候希望同样不分词,直接搜索整串数字
试了加引号,用TERMQUERY搜索.都不成功...
有没有人指 点下?
比如,9639639,搜9*可以查到,963963?也可以查到
但是9639639就不行......
或者这个问题跟LUCENE无关,是我代码的问题?

发现问题原因了:构建boolean query时,如果多次查询同一个FIELD,会查不到结果.
比如,Term term1 = new Term(field, key1);
query1 = new TermQuery(term1);
Term term2 = new Term(field, key2);
query2 = new TermQuery(term2);

然后把这两个query加入到boolean query中
搜索结果就是0.....

有什么解决方法么?
我初步想分两次,查出两个hits
不过太不优雅......
kinghongen 2009-09-16
拿这个类测试下


public class TestNumber {

private static final String filePath = "d:/wanghe/01";

private static final Analyzer analyzer =  new StandardAnalyzer();
//Analyzer analyzer =  new PaodingAnalyzer();

/**
* 方法描述.
* @param args
*/
public static void main(String[] args) {
createIndex();
try {
search("number","9639639");
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 搜索.
* @param field 域
* @param str   搜索字符串
* @throws IOException
* @throws CorruptIndexException
*/
public static void search(String field,String str) throws CorruptIndexException, IOException {
Term term = new Term(field, str);
Query query = new TermQuery(term);
// 验证是否可搜索
if (IndexReader.indexExists(filePath)) {
Searcher t_searcher  = new IndexSearcher(filePath);

TopDocCollector docCollector = new TopDocCollector(10);
t_searcher.search(query, docCollector);

// 下面是取出具体的数据
ScoreDoc[] docs = null;
if (docCollector == null || docCollector.getTotalHits() == 0) {
} else {
docs = docCollector.topDocs().scoreDocs;
}
System.out.println("OA命中:" + docCollector.getTotalHits());
if (docs != null) {
for (int j = 0; j < docs.length; j++) {
Document document = t_searcher.doc(docs[j].doc);
System.out.println("number===" + document.get("number") + "      " + "Title===" + document.get("Title"));
}
}
} else {
System.out.println("索引目录错误。");
}
}

/**
* 建立索引.
*/
public static void createIndex(){
try {
IndexWriter writer = new IndexWriter(filePath, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);
Document doc1 = new Document();
Field f1 = new Field("Title", "关于中华人民共和国", Field.Store.YES, Field.Index.ANALYZED);
//存储不分词
Field f2 = new Field("number", "9639639", Field.Store.YES, Field.Index.NOT_ANALYZED);
doc1.add(f1);
doc1.add(f2);
writer.addDocument(doc1);
writer.optimize();
writer.close();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (LockObtainFailedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

}
xajhzc 2009-09-16
终于有人给指路了~~~
我试试
xajhzc 2009-09-16
这个类就可以搜到....
我想想问题可能会出在哪......
kinghongen 2009-09-16
你的booleanQuery中添加的2个TermQuery,Field相同,值一样吗?

如 number:5 number:5
如果2个完全一样感觉没有意义


如:number:5 number:6
booleanQuery添加2个TermQuery的时候你用的是 BooleanClause.Occur.SHOULD就应该没问题啊。
xajhzc 2009-09-17
我就是举个例子
实际应用比较复杂.怕说不清
无奈下做了分类检索,search两次搞定
还是谢谢楼上了
Global site tag (gtag.js) - Google Analytics