インデックスで利用可能なすべてのレコードを取得できる必要があります。1000が限界のようです。他にできることはありますか?
質問する
426 次
1 に答える
-1
私は自分のプロジェクトの 1 つで同様の問題に直面していたので、インターネットで調査したところ、Search API を使用する代わりに回避策のシナリオを作成したという 1 つのアイデアを得ました。私がしたことは、パターンベースの検索が必要な属性がテーブルに 1 つしかないことです。ここでもコードを共有しています。
オブジェクト化エンティティ クラス
@Entity
public class NewsFeed {
@Id
@Index
private Long feedID;
private String title;
private Set<String> titleKeywords;
// getters and setter
}
キーワードを同じテーブルに格納するためのロジック。エンティティのすべてのタイトル ワードをキーワードに分割し、それらをセット オブジェクトに格納しました。
NewsFeed newsFeed = new NewsFeed();
newsFeed.setTitle(title);
newsFeed.setTitleKeywords(getKeywordsSet(newsTitle));
// save entity here
タイトル(検索対象フィールド)からキーワードを抽出する方法
public Set<String> getKeywordsSet(String title) {
Set<String> keywords = new HashSet<String>();
String titleNews = title.toLowerCase();
String[] array = titleNews.split(" ");
for (int i = 0; i < array.length; i++) {
// replacing all special characters here
String word = array[i].replaceAll("\\W", "");
keywords.add(word);
}
return keywords;
}
DB からのすべてのフィードを一覧表示し、最終的に検索するパラメーターを以下のロジックで一致させます。
public List<NewsFeed> getFilterJsonArray(String param){
// Listing all the objects of entity
List<NewsFeed> list = newsFeedDao.listOrderedFeeds();
List<NewsFeed> matchedObject = new ArrayList<NewsFeed>();
for (NewsFeed newsFeed : list) {
/**
* main logic for pattern matched keywords
**/
if (isAnElementInSet(newsFeed.getTitleKeywords(), param.toLowerCase())) {
matchedObject.add(newsFeed);
}
}
return matchedObject;
}
public boolean isAnElementInSet(Set<String> keywords, String param) {
String []params = param.split(" ");
if (keywords.size() > 0) {
for(String splittedParam : params){
if (keywords.contains(splittedParam)) {
return true;
} else{
for (String keyword : keywords) {
if(keyword.contains(splittedParam)){
return true;
}
}
return false;
}
}
return true;
}else{
return false;
}
}
これが物事を検索するための最良の解決策ではないことはわかっていますが、この解決策は私にとって非常にうまく機能しました。このロジックも改善するために、ここで共有しました。
于 2013-04-02T07:27:03.437 に答える