[英]Build a lucene kind of query for searching text on various properties in neo4j Cypher 2.x
[英]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:FOO或b.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.