[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两次搞定 还是谢谢楼上了 |
相关讨论
相关资源推荐
- JSP_Struts标签 bean:message
- 关于struts标签bean:message
- bean:message
- 关于struts标签bean:message(转)
- 关于struts标签bean:message(转)
- java bean validator_关于java:使用Spring的Validator界面进行Bean验证中的自定义消息
- 【Struts】bean标签库
- java 多线程bean 注入_如何在多线程中注入bean?!
- 谈谈Spring中的对象跟Bean,你知道Spring怎么创建对象的吗?
- java bean validator_在系统中使用Bean Validation验证参数