例如:
這是我要搜索的物件的名稱屬性:
Lorem ipsum dolor sit amet, consectetur adipiscing elit
當我填寫 "lo adip tetur" (lo (= Lorem), dipi (=adipiscing), tetur (=consectetur) ) 時,我希望能夠找到這個物件。
我試圖在空間上拆分我的 name 屬性并將其傳遞給 jpa 方法,但我沒有得到任何結果。
List<Obj> findAllByNameIgnoreCaseContaining(String[] splittedName);
解決這個問題的正確方法是什么?謝謝!
uj5u.com熱心網友回復:
正則運算式查詢將允許您指定這種型別的復雜文本搜索條件。
許多資料庫都支持正則運算式,并且可以在使用本機查詢時提供。
postgres的示例可能如下所示:
@Query(nativeQuery = true, value =
"SELECT * FROM my_entity
WHERE text_column ~ :contentRegex")
List<MyEntity> findByContentRegex(@Param("contentRegex") String contentRegex);
為了匹配前三個單詞的前兩個字符,您可以傳遞一個像這樣的正則運算式:
var result = repository.findByContentRegex("^Lo\S*\sip\S*\sdo.*");
(以 開頭的字串Lo,后跟任意數量的非空白字符、空白字符、、ip任意數量的非空白字符、空白字符、do和任意數量的任意字符)
當然,您可以動態組裝正則運算式,例如通過連接用戶提供的搜索詞片段:
List<String> searchTerms = List.of("Lo", "ip", "do"); // e.g. from http request url params
String regex = "^" String.join("\S*\s", searchTerms) ".*";
var result = repository.findByContentRegex(regex);
有關互動式游樂場,請參見例如https://regex101.com/ 。
請注意,復雜的運算式可能會導致查詢變得昂貴,因此人們可能會在某些時候考慮更高級的方法,例如可以使用特殊索引的全文搜索。https://www.postgresql.org/docs/current/textsearch-intro.html
另請注意,建議為潛在的敵對引數源設定查詢超時。
除此之外,還有更專業的搜索服務器,例如apache-solr。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/424559.html
