Apache Lucene возвращает поля фасета из документа

Я новичок в Apache Lucene. Я использую последнюю версию: 6.3.0 в сочетании с библиотекой фасетов.
На основе примеров, которые я нашел на github: https://github.com/apache/lucene-solr/tree/master/lucene/demo/src/java/org/apache/lucene/demo/facet

У меня есть следующий документ

Document doc = new Document();
doc.add(new FacetField("Author", "Bob"));
doc.add(new FacetField("Publish Date", "2010", "10", "15"));
doc.add(new FacetField("Tags", "A"));
doc.add(new FacetField("Tags", "B"));

//[FacetField(dim=Author path=[Bob]), FacetField(dim=Publish Date path=[2010, 10, 15]), FacetField(dim=Tags path=[A]), FacetField(dim=Tags path=[B])]
System.out.println(doc.getFields());

//null
System.out.println(doc.getField("Author"));

doc.getFields() возвращает все поля, но doc.getField("Author")возвращает null.
Я делаю что-то не так?

Копать дальше, если я сделаю что-то подобное:

for(IndexableField myField:doc.getFields()){
    System.out.println(myField.name());
}

Печатается следующее:

dummy
dummy
dummy
dummy

И если я сделаю что-то подобноеdoc.getField("dummy"), то действительно верну первое поле(автор).

Просмотр исходного кода FacetField: https://github.com/apache/lucene-solr/blob/branch_6_3/lucene/facet/src/java/org/apache/lucene/facet/FacetField.java
Создается впечатление, что все фасетные поля создаются с помощью «манекена»: https://github.com/apache/lucene-solr/blob/branch_6_3/lucene/facet/src/java/org/apache/lucene/facet/FacetField.java

public FacetField(String dim, String... path) {
super("dummy", TYPE);

Это ошибка?

2 ответа

  1. В соответствии с моим пониманием, вы пытаетесь получить значение автора, которое должно быть возвращено как «Bob».

    FacetField & Field — это два разных типа полей в Lucene, и они хранят данные по-разному. И FacetField является дочерним классом класса Field. Чтобы инициализировать поле, вам нужно имя поля, введите & логическое значение, которое означает, что вы хотите получить поле или нет.

    открытый класс FacetField расширяет поле

    А вот пример инициализации поля

    Field pathField = новое строковое поле («путь», file.toString(),
    Поле.Магазин.YES);
    doc.добавить (поле пути);

    Теперь, для того, чтобы сохранить документы, вы должны сделать это так.

    SolrInputDocument doc = новый SolrInputDocument ();
    Строка id = «1»;
    String author = «Erick»;
    Текст строки = «I love Solr book»;
    доктор.addField («id», id);
    доктор.addField («автор», название);
    доктор.addField («text», текст);

    Для того, чтобы undertand The solr Indeing & Searching using Solrj, пожалуйста, почитайте эту ссылку .

    Надеюсь, это поможет.

  2. Я сам столкнулся с тем же вопросом. Если бы вы написали упомянутый документ и получили его с помощью поиска, вы бы увидели, что поля фасетов на самом деле не хранятся как часть документа. Кроме того, поиск значения в поле фасета не работает (возвращает 0 результатов). Было бы неплохо, если бы был флаг или что-то, что привело бы к тому, что поле записывается как в таксономию, так и в сам индекс, но я думаю, что проблема в том, что индекс документа имеет несколько других атрибутов, которые не применяются к полям фасета, поэтому они просто держат их отдельно, чтобы избежать путаницы.

    Способ, которым я работал с этим, заключается в написании поля дважды в документе: одно как поле фасета и другое поле с требуемыми атрибутами.

    Образец:

    Document doc = new Document();
    
    // Add facet fields, not stored/searchable, but can be drilled down into
    doc.add(new FacetField("Author", "Bob"));
    ...
    
    // Add other fields
    doc.add(new TextField("Author", "Bob", Store.YES));
    ...