我使用Lucene 4.1索引关键字/值对,其中关键字和值不是真正的单词--也就是说,它们是电压、设置,不应该被分析或标记。例如$P14R / 16777216。(这是任何流动细胞学专家的FCS数据)
对于索引,我创建了一个FieldType,其索引为真、存储=真和标记化= false。这些模仿古时的Field.Keyword从卢塞尼1,我有这本书。-)我甚至冻结了fieldType。
我在调试器中看到了这些值。我创建文档和索引。
当我阅读索引和文档并查看调试器中的字段时,我看到了所有字段。名字和fieldsData看起来都是正确的。然而,FieldType错了。它显示索引=真、存储=真和令牌化=真。结果是我的搜索(使用TermQuery)不起作用。
我怎么才能解决这个问题?谢谢。
附注:我在IndexWriterConfig中使用了一个IndexWriterConfig。稍后,我将尝试发布一些演示代码,但今天的实际工作已经开始了。:-)
演示代码:
public class LuceneDemo {
public static void main(String[] args) throws IOException {
Directory lDir = new RAMDirectory();
Analyzer analyzer = new KeywordAnalyzer();
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_41, analyzer);
iwc.setOpenMode(OpenMode.CREATE);
IndexWriter writer = new IndexWriter(lDir, iwc);
// BTW, Lucene, anyway you could make this even more tedious???
// ever heard of builders, Enums, or even old fashioned bits?
FieldType keywordFieldType = new FieldType();
keywordFieldType.setStored(true);
keywordFieldType.setIndexed(true);
keywordFieldType.setTokenized(false);
Document doc = new Document();
doc.add(new Field("$foo", "$bar123", keywordFieldType));
doc.add(new Field("contents", "$foo=$bar123", keywordFieldType));
doc.add(new Field("$foo2", "$bar12345", keywordFieldType));
Field onCreation = new Field("contents", "$foo2=$bar12345", keywordFieldType);
doc.add(onCreation);
System.out.println("When creating, the field's tokenized is " + onCreation.fieldType().tokenized());
writer.addDocument(doc);
writer.close();
IndexReader reader = DirectoryReader.open(lDir);
Document d1 = reader.document(0);
Field readBackField = (Field) d1.getFields().get(0);
System.out.println("When read back the field's tokenized is " + readBackField.fieldType().tokenized());
IndexSearcher searcher = new IndexSearcher(reader);
// exact match works
Term term = new Term("$foo", "$bar123" );
Query query = new TermQuery(term);
TopDocs results = searcher.search(query, 10);
System.out.println("when searching for : " + query.toString() + " hits = " + results.totalHits);
// partial match fails
term = new Term("$foo", "123" );
query = new TermQuery(term);
results = searcher.search(query, 10);
System.out.println("when searching for : " + query.toString() + " hits = " + results.totalHits);
// wildcard search works
term = new Term("contents", "*$bar12345" );
query = new WildcardQuery(term);
results = searcher.search(query, 10);
System.out.println("when searching for : " + query.toString() + " hits = " + results.totalHits);
}
}产出将是:
When creating, the field's tokenized is false
When read back the field's tokenized is true
when searching for : $foo:$bar123 hits = 1
when searching for : $foo:123 hits = 0
when searching for : contents:*$bar12345 hits = 1发布于 2013-03-01 16:35:36
您可以尝试对不想标记的字段使用KeywordAnalyzer。
如果您需要多个分析器(也就是说,如果您有其他需要标记化的字段),PerFieldAnalyzerWrapper就是方法。
发布于 2015-06-19 08:21:05
Lucene以小写存储所有令牌-因此,您需要首先将搜索字符串转换为小写,以用于非标记化字段。
发布于 2013-03-02 07:25:58
演示代码证明,当您将令牌读取回来时,它的值是不同的。不确定那是否是个bug。
但这并不是部分搜索不起作用的原因。部分搜索不起作用,因为Lucene不执行部分搜索(除非使用通配符),例如在StackOverflow这里是这么说的
使用谷歌这么久了,我想我不明白。:-)
https://stackoverflow.com/questions/15161990
复制相似问题