1

QueryBuilder/Query を介してノードを検索しようとしていますが、うまく機能していないようです。約 6000 レコードを検索する次のコード メソッドがあります。

public String searchRows(String search, int start, int length){
        Map<String, String> searchMap = new HashMap<String, String>();
        searchMap.put("path", this.path);
        searchMap.put("fulltext", search);
        Query query = this.builder.createQuery(PredicateGroup.create(searchMap), this.session);
        query.setStart(start);
        query.setHitsPerPage(length);
        SearchResult result = query.getResult();
        //return result.getQueryStatement();
        StringBuilder sb = this.createBasicInfo(result.getTotalMatches());
        sb.append(this.toaaData(result));
        sb.append("}");
        return sb.toString();
    }

部分的に一致する結果を得たいと思っています。たとえば、これらのプロパティを持つノードがあります

Company   "My Drugstore Abc"
City      "My City"
Street    "Some Street"

「Abc」を検索しようとすると正しい結果が得られますが、「drugstore」または「my」を検索しようとすると何も得られません。また、「city」または「street」を検索しようとしても、何も得られません...どうすればこれを解決できますか? このように検索語を編集しようとしました

searchMap.put("fulltext", "*"+search+"*");

この

searchMap.put("fulltext", "%"+search+"%");

しかし、それはまだ私が必要とする方法で機能しませんでした...

これは、result.getQueryStatement(); から取得した Xpath です。

/jcr:root/my/path//*[jcr:contains(., 'city')]

助けてくれてありがとう

編集:私はこれを発見しました

searchMap.put("fulltext", "*"+search+"*");

基本的に必要な方法で動作しますが、結果が悪い順序で返される可能性があるほど遅いです。クエリは、アスタリスクなしで 2 ~ 80 ミリ秒かかりますが、アスタリスクがある場合は 1 ~ 6 秒です。どうすればこれを解決できますか?

4

1 に答える 1

2

次のパターンを使用してワイルドカード検索を行うと、一般的に遅いと見なされます。

/jcr:root/my/path//*[jcr:contains(., '*searchterm*')]

この種のクエリは避けたほうがよいでしょう。通常、特定のプロパティでワイルドカードを使用せずに全文検索を行う方が高速です。

Doing jcr:contains(@jcr:PropertyName, 'searchterm')

効率的なコンテンツ構造とクエリに関する Marcel Reuteggers のプレゼンテーションを参照してください。一部のパフォーマンス クリティカルなクエリ パターンを回避する方法を理解するのに役立ちます。 http://de.slideshare.net/CQCON/prsentation-marcel-reutegger

于 2013-06-26T07:55:56.750 に答える