【问题标题】:How to use TermVector Lucene 4.0如何使用 TermVector Lucene 4.0
【发布时间】:2023-03-21 21:13:01
【问题描述】:

在索引方法中,我使用以下行:

Field contentsField = new Field("contents", new FileReader(f), Field.TermVector.YES);

但是,在 Lucene 4.0 中,此构造函数已被弃用,应使用 new TextField 而不是 new Field

TextField 的问题在于它的构造函数中不接受TermVector

有没有办法使用新的构造函数在我的 Lucene 4.0 索引中包含术语向量?

谢谢

【问题讨论】:

    标签: java search lucene


    【解决方案1】:

    我被这件事难住了一段时间。这里的其他答案很有帮助,但即使有他们,情况对我来说并不明显。因此,在我终于亮起灯后,我决定添加这个额外的答案,以便让下一个人更清楚。

    支持术语向量的Field 签名被贬值的原因是它使用了从Lucene 4.0 开始贬值的Field.TermVector enum

    在 Lucene 4.0 中,一个新的方法签名被添加到 Field 类,它支持传递 FieldTypeFieldType 类比旧的 enum 方法更灵活,并且提供了设置比以前可用的更多字段选项的能力。

    这是一个示例,说明如何通过在实例化 Field 对象时传递 FieldType 对象来创建支持术语向量的文本字段,而不是存储。

         FieldType specialTextFieldType = new FieldType(TextField.TYPE_NOT_STORED);
         specialTextFieldType.StoreTermVectors = true;
    
         Document exampleDoc = new Document();
         exampleDoc.Add(new Field("SomeField", someData, specialTextFieldType ));
    

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,所以我只是简单地创建了自己的字段:

      public class VecTextField extends Field {
      
      /* Indexed, tokenized, not stored. */
      public static final FieldType TYPE_NOT_STORED = new FieldType();
      
      /* Indexed, tokenized, stored. */
      public static final FieldType TYPE_STORED = new FieldType();
      
      static {
          TYPE_NOT_STORED.setIndexed(true);
          TYPE_NOT_STORED.setTokenized(true);
          TYPE_NOT_STORED.setStoreTermVectors(true);
          TYPE_NOT_STORED.setStoreTermVectorPositions(true);
          TYPE_NOT_STORED.freeze();
      
          TYPE_STORED.setIndexed(true);
          TYPE_STORED.setTokenized(true);
          TYPE_STORED.setStored(true);
          TYPE_STORED.setStoreTermVectors(true);
          TYPE_STORED.setStoreTermVectorPositions(true);
          TYPE_STORED.freeze();
      }
      
      // TODO: add sugar for term vectors...?
      
      /** Creates a new TextField with Reader value. */
      public VecTextField(String name, Reader reader, Store store) {
          super(name, reader, store == Store.YES ? TYPE_STORED : TYPE_NOT_STORED);
      }
      
      /** Creates a new TextField with String value. */
      public VecTextField(String name, String value, Store store) {
          super(name, value, store == Store.YES ? TYPE_STORED : TYPE_NOT_STORED);
      }
      
      /** Creates a new un-stored TextField with TokenStream value. */
      public VecTextField(String name, TokenStream stream) {
          super(name, stream, TYPE_NOT_STORED);
      }
      

      }

      希望对你有帮助

      【讨论】:

        【解决方案3】:

        TextField 是一个方便的类,适用于需要没有术语向量的索引字段的用户。如果您需要术语向量,只需使用Field。由于您需要先创建FieldType 的实例,将storeTermVectorstokenizer 设置为true,然后在Field 构造函数中使用此FieldType 实例,因此需要多几行代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-07-17
          • 2023-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多