Lucene - 不需要编入索引的字符串字段

时间:2016-05-29 17:58:06

标签: java lucene

(目前正在使用Lucene 4.6)。

只是想知道为什么在org.apache.lucene.document.Document中存储未编入索引的文本信息是不合适的。 TextField被编入索引并进行标记化。 <{1}}已编入索引但未标记化。

但是假设您只需要StringField附带String中其他信息的org.apache.lucene.document.Document,但它本身永远不会成为查询的主题吗?

只是(在4.6中)org.apache.lucene.document.Field.Index有一个“NO”,意思是“不要索引字段值。”,但这是目前“已弃用”。

为什么呢?有没有更好的方法让索引(可能是标记化的)更重要的字段附带“惰性”String信息?

2 个答案:

答案 0 :(得分:1)

您可以将以下constructor用于您的字段

Field(java.lang.String, java.lang.String, org.apache.lucene.document.FieldType)

FieldType有property

public void setIndexed(boolean value)

或者您可以创建自定义字段,在该字段中,您需要覆盖字段类型的默认构造函数:

public final class StringNoIndexedField extends Field {
   public static final FieldType TYPE_NOT_INDEXED = new FieldType();
   static {
      TYPE_NOT_INDEXED.setIndexed(false);
      TYPE_NOT_INDEXED.setStored(true);
      TYPE_NOT_INDEXED.setTokenized(false);
      TYPE_NOT_INDEXED.freeze();
  }

  public StringNoIndexedField(String name, String value) {
    super(name, value, TYPE_NOT_INDEXED);
  }
}

答案 1 :(得分:1)

(差不多)2年后,我希望对事情有一点了解。

答案似乎是使用final Tooltip tooltip = new Tooltip(); tooltip.setStyle("-fx-background-color: yellow"); tooltip.setText("Message");

事实上,StoredFieldTextField存储在索引中并从StringField中检索。与StoredFieldStoredField一样,TextField是&#34;不可知的&#34;所有这些都是StringField的子类,其中包括Field setStringValue }},setIntValuestringValuenumericValue

Lucene 6没有IntField ...但是有一个&#34;红鲱鱼&#34;叫IntPoint。它是一个红鲱鱼,因为它无法存储在索引中......永远!

事实上,如果您需要存储Integer,我(我认为)需要使用StoredField或(如果需要编入索引)StringField

请参阅this recent answer of mine