Cloudantの新機能ですが、しばらくの間DB2上でSQLで開発しました。私はLuceneクエリエンジンとCloudantインデックスを使用してクエリから結果を返すと思っています。クエリは、私が望むすべての結果を取得しますが、正しくソートされません。私は結果を "officialName"フィールドに基づいてアルファベット順にソートしたいと思っています。私たちはn個の結果のうち最初の21個を返すだけです(ページングでさらに結果を呼び出すjsハンドラがあります)ので、Java側でソートすることはできませんが、Cloudantを使用してソートする必要があります。当社のアプリケーションはJavaを実行し、IBMのBluemixとWebSphere Liberty Profileを使用して実行されます。 Cloudantデータベースにアクセスするために、cloudant-client-2.8.0.jarとcloudant-HTTP-2.8.0.jarファイルをパッケージ化しました。多くのクエリが動作しているので、接続自体は問題ありません。ここでLucene検索でクラウド検索が期待どおりに並べ替えに失敗する
はCloudantクライアントの検索オブジェクトを構築するコードです:ここでは
Search search = getCloudantDbForOurApp().search("bySearchPP-ddoc/bySearchPP-indx").includeDocs(true);
SearchResult<DeliverableDetails> result = search.sort(getSortJsonString(searchString)).querySearchResult(getSearchQuery(searchString), DeliverableDetails.class);
はメソッドgetSortJsonStringです。検索文字列は通常はヌルではないことに注意してください。 -score属性を出し入れすると検索には影響はありますが、アルファソートされた結果は決して得られません。
{
"_id": "_design/bySearchPP-ddoc",
"_rev": "4-a91fc4ddeccc998c58adb487a121c168",
"views": {},
"language": "javascript",
"indexes": {
"bySearchPP-indx": {
"analyzer": {
"name": "perfield",
"default": "standard",
"fields": {
"alias": "simple",
"contact": "simple",
"deploymentTarget": "keyword",
"businessUnit": "keyword",
"division": "keyword",
"officialName": "simple",
"deliverableName": "simple",
"pid": "keyword"
}
},
"index": "function(doc) {
if (doc.docType === \"Page\") {
index(\"officialName\", doc.officialName, {\"store\":true, \"boost\":4.0});
index(\"deliverableName\", doc.deliverableName, {\"store\":true, \"boost\":3.0});
if (doc.aliases) {
for (var i in doc.aliases) {
index(\"alias\", doc.aliases[i], {\"store\":true, \"boost\":2.0});
}
}
if (doc.allContacts) {
for (var j in doc.allContacts) {
index(\"contact\", doc.allContacts[j], {\"store\":true, \"boost\":0.5});
}
}
index(\"deploymentTarget\", doc.deploymentTarget, {\"store\":true});
index(\"businessUnit\", doc.businessUnit, {\"store\":true});
index(\"division\", doc.division, {\"store\":true});
index(\"pid\", doc.pid.toLowerCase(), {\"store\":true});
}
}"
}
}
}
私はわからない:次のように私はセットアップにCloudantダッシュボードを使用して、設計ドキュメントとインデックスを持っている
...
query += "(";
query += "officialName:" + searchString + "^3";
query += " OR " + "deliverableName:" + searchString + "^3";
query += " OR " + "alias:" + searchString + "^3";
query += " OR " + "contact:" + searchString;
query += ")";
....
// The query will look like below, where<search_string> is some user inputted value
// (officialName:<search_string>*^3 OR deliverableName:<search_string>*^3 OR alias:<search_string>*^3 OR contact:<search_string>*)
:ここ
private String getSortJsonString(String searchString) {
String sortJson;
if (searchString != null && !searchString.isEmpty()) {
sortJson = "[\"-<score>\",\"officialName<string>\"]";
} else {
sortJson = "\"officialName<string>\"";
}
return sortJson;
}
は、参考のためgetSearchQuery方法の関連するコードですソートが機能していて、どうしたらいいかやっていないか、何かを間違って設定してしまった場合には、いずれにしても、どんな助けでも大歓迎です。 -Doug
場合によってはスコア順に並べ替えてから公式名でソートしています。これは問題ではありませんか? – markwatsonatx
[SearchResultRow](http://static.javadoc.io/com.cloudant/cloudant-client/2.2.0/com/cloudant/client/api/model/SearchResult.SearchResultRow.html)で注文を見ることができます。並べ替えで使用される値を表示します。各行の配列の最初の値は、ソートで使用された最初の値に対応します。 for(Object obj:row.getOrder()){ System.out.println(obj); } – markwatsonatx
@markwatsonatx - 私がスコアタグを取り出したかどうかは問題ではありませんでした。彼はデバッグのヒントありがとう。これは、officialName値が返されていないことを示しています。いくつかの掘り出し物を見つけましたが、フィールドがインデックスに登録されているが、トークン化されていないはずです。私はインデックスフォームの単純なアナライザーをキーワードに変更しました。ヒントをありがとう。 – Doug