【问题标题】:Is it necessary to save the field itself to generate inverted index in lucene是否需要保存字段本身才能在lucene中生成倒排索引
【发布时间】:2017-10-19 03:55:10
【问题描述】:
我在 lucene 中保存字段 id 和 msg 以支持全文搜索。当用户输入关键字时,lucene 执行搜索并显示结果,当用户使用保存的 id 点击该关键字时,我打开从数据库中获取结果并显示更多详细信息。
lucene 是否可以只在 msg 字段上保存倒排索引而不是整个 msg 字段,然后只将 id 交给我,以便我可以从数据库中获取结果以显示结果?
这样做我的数据不会是多余的。
【问题讨论】:
标签:
java
indexing
lucene
full-text-search
inverted-index
【解决方案1】:
在 Lucene 中,您为文档创建/获取目的而存储的内容(您通过 DB 描述的目的)和为搜索目的而作为倒排索引索引的内容是两件截然不同的事情。
您没有显示任何代码作为您的索引方式。
在 Lucene 中存储数据是可选的,人们也选择存储数据以避免额外的数据库调用等,但会以存储空间为代价,但将数据保留在主源中也会减少同步要求。所以有一个权衡。
在下面的代码 sn-p 中,DOC_ID 也被索引和存储,而 TEXT_FIELD 只是被索引而不是存储。
Document doc = new Document();
doc.add(new Field("DOC_ID", "DOCONE", new FieldType(
TextField.TYPE_STORED)));
doc.add(new Field("TEXT_FIELD", "This", new FieldType(
TextField.TYPE_NOT_STORED)));
writer.addDocument(doc);
所以在搜索之后,假设你的命中文档是 - hitDoc 所以你会得到下面,
hitDoc.getField("DOC_ID")="DOCONE" 和 hitDoc.getField("TEXT_FIELD")=NULL
两个字段都已编入索引,但只存储一个。索引意味着它可以被搜索。