簡體   English   中英

Lucene Cypher查詢策略

[英]Lucene Cypher query strategy

首先,我們使用的技術是Neo4j,Spring和Spring Data Neo4j(所有最新的穩定版本)。

我們要求用戶應該能夠分別搜索我們所有的實體,並且還必須提供所有實體的所有全局搜索。 我希望收集有關如何實施全局搜索的建議。 以下是一些(簡化的!)代碼,顯示了如何查詢實體。 每個實體使用其自己的Lucene索引。

實體結構:

@NodeEntity
public abstract class BaseEntity {

    @GraphId
    private Long id;

}

@NodeEntity
public class A extends BaseEntity {

    private static final String INDEX = "A_Index";

    public static final String SEARCH_QUERY = "START a=node:" + INDEX + "({name}) RETURN a";

    @Indexed(indexType = IndexType.FULLTEXT, indexName = INDEX)
    @NotBlank
    private String name;

}

@NodeEntity
public class B extends BaseEntity {

    private static final String INDEX = "B_Index";

    public static final String SEARCH_QUERY = "START b=node:" + INDEX + "({name}) RETURN b";

    @Indexed(indexType = IndexType.FULLTEXT, indexName = INDEX)
    @NotBlank
    private String name;

}

存儲庫類:

@Repository
public interface ARepository extends GraphRepository<A> {

    @Query(A.SEARCH_QUERY)
    List<A> find(@Param("name") String name, Pageable pageable);

}


@Repository
public interface BRepository extends GraphRepository<B> {

    @Query(B.SEARCH_QUERY)
    List<B> find(@Param("name") String name, Pageable pageable);

}

我如何訪問存儲庫類(再次非常簡化):

@Service
public class Service {

    @Autowired
    private ARepository repository;

    public List<A> search(final String name) {
        return repository.find("name:*" + name + "*", null);
    }

}

因此,當您搜索單個實體類型時,所有這些都很好用。 有人可以建議最好的方法是實施全局搜索來搜索每種實體類型嗎?

認為我一直在思考:

  • 使用單個Lucene索引,而不是每個實體的索引。 在@Indexed中提供一個字段名,例如“ a.name”或“ b.name”。 (a.name:FOOb.name:FOO)然后像“globalIndex一個查詢使用的每個字段名稱。(其實不知道這是否是可能的)

  • 針對每種實體類型啟動單獨的搜索調用,並將結果合並。 但是,基於索引分數來實現分頁和排序將很困難。

我並不擔心性能,因為我們將使用相對較小的數據集。

最后一個問題:從Cyluc Lucene查詢返回的結果是否總是按其索引分數排序? 如果沒有,我應該如何在SDN中執行此操作?

我認為您的第一選擇最有意義。

通常,您還可以使用indexLevel=Level.CLASS來獲取所有實體的全局索引(或對所有實體使用相同的索引名稱)。 然后在查詢期間,如果where a.__type__ = {fqn}類型過濾,還添加一個where過濾器: where a.__type__ = {fqn} fqn是完全限定名稱(或者如果您使用@TypeAlias該值)

目前不支持按分數排序,一般而言,密碼僅按您可以直接在圖形中訪問的內容進行排序。

PS雖然有一個注釋,該注釋在單個字段上接受多個@Indexed注釋,然后將它們全部兌現,這將很酷(盡管如果您要從字段中推斷索引,這會帶來一些問題)。 隨時在SDN JIRA上提出問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM