Я новичок в 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);
Это ошибка?
В соответствии с моим пониманием, вы пытаетесь получить значение автора, которое должно быть возвращено как «Bob».
FacetField & Field — это два разных типа полей в Lucene, и они хранят данные по-разному. И FacetField является дочерним классом класса Field. Чтобы инициализировать поле, вам нужно имя поля, введите & логическое значение, которое означает, что вы хотите получить поле или нет.
А вот пример инициализации поля
Теперь, для того, чтобы сохранить документы, вы должны сделать это так.
Для того, чтобы undertand The solr Indeing & Searching using Solrj, пожалуйста, почитайте эту ссылку .
Надеюсь, это поможет.
Я сам столкнулся с тем же вопросом. Если бы вы написали упомянутый документ и получили его с помощью поиска, вы бы увидели, что поля фасетов на самом деле не хранятся как часть документа. Кроме того, поиск значения в поле фасета не работает (возвращает 0 результатов). Было бы неплохо, если бы был флаг или что-то, что привело бы к тому, что поле записывается как в таксономию, так и в сам индекс, но я думаю, что проблема в том, что индекс документа имеет несколько других атрибутов, которые не применяются к полям фасета, поэтому они просто держат их отдельно, чтобы избежать путаницы.
Способ, которым я работал с этим, заключается в написании поля дважды в документе: одно как поле фасета и другое поле с требуемыми атрибутами.
Образец: