1。今天研究了一下lucene,对于初学者来说,有一个地方以前还没怎么弄懂,可能不是很用心吧。今天又写点小的作业,用lucene来实现,对于以前遇到的这点问题进行了总结。
Lucene提供四个不同的字段类型,你可以从中做出选择:
Lucene提供四个不同的字段类型,你可以从中做出选择:
n
Keyword—不被分析,但是被索引并逐字存储到索引中。这个类型适合于原始值需要保持原样的字段,如
URL、文件系统路径、日期、个人名称、社会安全号码、电话号码等等。例如,我们在Indexer(列表1.1)中把文件系统路径作为Keyword字段。
n
UnIndexed—不被分析也不被索引,但是它的值存储到索引中。这个类型适合于你需要和搜索结果一起显示的字段
(如URL或数据库主键),但是你从不直接搜索它的值。因为这种类型字段的原始值存储在索引中,这种类型不适合于存放比较巨大的值,如果索引大小是个问题的话。
n
UnStored—和
UnIndexed相反。这个字段类型被分析并索引但是不存储在索引中。它适合于索引大量的文本而不需要以原始形式重新获得它。例如网页的主体或任休其它类型的文本文档。
n
Text—被分析并索引。这就意味着这种类型的字段可以被搜索,但是要小心字段大小。如果要索引的数据是一个
String,它也被存储;但如果数据(如我们的Indexer例子)是来自一个Reader,它就不会被存储。这通常是混乱的来源,所以在使用Field.Text时要注意这个区别。
上面是lucene in Action中写道的,但是以前不是理解的很到位,今天弄明白了些。
1。对于keyword--我们在程序当中可以通过keyword进行查找,并可以通过get(“keyword”)来获取keyword的值
举例:
如
IndexWriter writer = new IndexWriter(dir, getAnalyzer(), false);
string keyword="1234567".
Document doc= new Document();
doc.add(Field.Keyword("telephone","1234567"))
doc.close();
writer.addDocument(doc);
Query query = QueryParser.parse(str, "telephone", new StandardAnalyzer());
Hits hits = is.search(query);
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i);
System.out.print(doc.get("telephone"));
}
打印的结果为:1234567
就是
2。对于Unindexed,我们不能通过这个字段来索引,如果你这样做,那么肯定差不到任何值,但是通过其它的如keyword索引后,如Unindexed的字段设为city。你通过keyword查询后,可以通过调用get("city")的值来获取unIndexed的值。
IndexWriter writer = new IndexWriter(dir, getAnalyzer(), false);
string keyword="1234567".
Document doc= new Document();
doc.add(Field. Unndexed ("telephone","1234567"))
doc.close();
writer.addDocument(doc);
Query query = QueryParser.parse(str, "telephone", new StandardAnalyzer());
Hits hits = is.search(query);
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i);
System.out.print(doc.get("telephone"));
}
打印的结果为:null
3. Unstore 这个字段支持索引,但是不保存原始的信息。通过调用get方法获得不了这个字段的值。
IndexWriter writer = new IndexWriter(dir, getAnalyzer(), false);
string keyword="1234567".
Document doc= new Document();
doc.add(Field.Keyword("telephone","1234567"))
doc.close();
writer.addDocument(doc);
Query query = QueryParser.parse(str, "telephone", new StandardAnalyzer());
Hits hits = is.search(query);
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i);
System.out.print(doc.get("telephone"));
}
打印的结果为:null
这个字段支持索引,我们可以通过这个字段进行索引,然后调用其他字段的值,但是不能通过其他字段索引调用这个字段的 get方法,那么还是不能够得到所塑要的值。
4. text
分两种情况
第一,以String为参数:
IndexWriter writer = new IndexWriter(dir, getAnalyzer(), false);
string keyword="1234567".
Document doc= new Document();
doc.add(Field.Text("telephone","1234567"))
doc.close();
writer.addDocument(doc);
Query query = QueryParser.parse(str, "telephone", new StandardAnalyzer());
Hits hits = is.search(query);
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i);
System.out.print(doc.get("telephone"));
}
输出结果为1234567
这是以字符串卫参数,那么既可以支持索引又可以调用这个字段保存的原始信息。
第二种情况
以文件流为参数
IndexWriter writer = new IndexWriter(dir, getAnalyzer(), false);
string keyword="1234567".
Document doc= new Document();
doc.add(Field.Text("telephone",new FileReader("hello.txt")))
doc.close();
writer.addDocument(doc);
Query query = QueryParser.parse(str, "telephone", new StandardAnalyzer());
Hits hits = is.search(query);
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i);
System.out.print(doc.get("telephone"));
}
假设未见hello.txt中存在1234567这个字符串。
输出结果为null
这个是以文件流为参数,他不保存原始的文件信息,但是支持索引。所以这个方法和unstore用起来是一样的。
上面是lucene in Action中写道的,但是以前不是理解的很到位,今天弄明白了些。
1。对于keyword--我们在程序当中可以通过keyword进行查找,并可以通过get(“keyword”)来获取keyword的值
举例:
如
IndexWriter writer = new IndexWriter(dir, getAnalyzer(), false);
string keyword="1234567".
Document doc= new Document();
doc.add(Field.Keyword("telephone","1234567"))
doc.close();
writer.addDocument(doc);
Query query = QueryParser.parse(str, "telephone", new StandardAnalyzer());
Hits hits = is.search(query);
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i);
System.out.print(doc.get("telephone"));
}
打印的结果为:1234567
就是
2。对于Unindexed,我们不能通过这个字段来索引,如果你这样做,那么肯定差不到任何值,但是通过其它的如keyword索引后,如Unindexed的字段设为city。你通过keyword查询后,可以通过调用get("city")的值来获取unIndexed的值。
IndexWriter writer = new IndexWriter(dir, getAnalyzer(), false);
string keyword="1234567".
Document doc= new Document();
doc.add(Field. Unndexed ("telephone","1234567"))
doc.close();
writer.addDocument(doc);
Query query = QueryParser.parse(str, "telephone", new StandardAnalyzer());
Hits hits = is.search(query);
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i);
System.out.print(doc.get("telephone"));
}
打印的结果为:null
3. Unstore 这个字段支持索引,但是不保存原始的信息。通过调用get方法获得不了这个字段的值。
IndexWriter writer = new IndexWriter(dir, getAnalyzer(), false);
string keyword="1234567".
Document doc= new Document();
doc.add(Field.Keyword("telephone","1234567"))
doc.close();
writer.addDocument(doc);
Query query = QueryParser.parse(str, "telephone", new StandardAnalyzer());
Hits hits = is.search(query);
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i);
System.out.print(doc.get("telephone"));
}
打印的结果为:null
这个字段支持索引,我们可以通过这个字段进行索引,然后调用其他字段的值,但是不能通过其他字段索引调用这个字段的 get方法,那么还是不能够得到所塑要的值。
4. text
分两种情况
第一,以String为参数:
IndexWriter writer = new IndexWriter(dir, getAnalyzer(), false);
string keyword="1234567".
Document doc= new Document();
doc.add(Field.Text("telephone","1234567"))
doc.close();
writer.addDocument(doc);
Query query = QueryParser.parse(str, "telephone", new StandardAnalyzer());
Hits hits = is.search(query);
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i);
System.out.print(doc.get("telephone"));
}
输出结果为1234567
这是以字符串卫参数,那么既可以支持索引又可以调用这个字段保存的原始信息。
第二种情况
以文件流为参数
IndexWriter writer = new IndexWriter(dir, getAnalyzer(), false);
string keyword="1234567".
Document doc= new Document();
doc.add(Field.Text("telephone",new FileReader("hello.txt")))
doc.close();
writer.addDocument(doc);
Query query = QueryParser.parse(str, "telephone", new StandardAnalyzer());
Hits hits = is.search(query);
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i);
System.out.print(doc.get("telephone"));
}
假设未见hello.txt中存在1234567这个字符串。
输出结果为null
这个是以文件流为参数,他不保存原始的文件信息,但是支持索引。所以这个方法和unstore用起来是一样的。