首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lucene 4.1忽略了FieldType.tokenized = false

Lucene 4.1忽略了FieldType.tokenized = false
EN

Stack Overflow用户
提问于 2013-03-01 16:10:37
回答 3查看 1.5K关注 0票数 1

我使用Lucene 4.1索引关键字/值对,其中关键字和值不是真正的单词--也就是说,它们是电压、设置,不应该被分析或标记。例如$P14R / 16777216。(这是任何流动细胞学专家的FCS数据)

对于索引,我创建了一个FieldType,其索引为真、存储=真和标记化= false。这些模仿古时的Field.Keyword从卢塞尼1,我有这本书。-)我甚至冻结了fieldType。

我在调试器中看到了这些值。我创建文档和索引。

当我阅读索引和文档并查看调试器中的字段时,我看到了所有字段。名字和fieldsData看起来都是正确的。然而,FieldType错了。它显示索引=真、存储=真和令牌化=真。结果是我的搜索(使用TermQuery)不起作用。

我怎么才能解决这个问题?谢谢。

附注:我在IndexWriterConfig中使用了一个IndexWriterConfig。稍后,我将尝试发布一些演示代码,但今天的实际工作已经开始了。:-)

演示代码:

代码语言:javascript
复制
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);
    }
}

产出将是:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2013-03-01 16:35:36

您可以尝试对不想标记的字段使用KeywordAnalyzer

如果您需要多个分析器(也就是说,如果您有其他需要标记化的字段),PerFieldAnalyzerWrapper就是方法。

票数 1
EN

Stack Overflow用户

发布于 2015-06-19 08:21:05

Lucene以小写存储所有令牌-因此,您需要首先将搜索字符串转换为小写,以用于非标记化字段。

票数 1
EN

Stack Overflow用户

发布于 2013-03-02 07:25:58

演示代码证明,当您将令牌读取回来时,它的值是不同的。不确定那是否是个bug。

但这并不是部分搜索不起作用的原因。部分搜索不起作用,因为Lucene不执行部分搜索(除非使用通配符),例如在StackOverflow这里是这么说的

使用谷歌这么久了,我想我不明白。:-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15161990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档