質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

2338閲覧

Ngramを用いて全文検索をおこなっているのですが、重複した検索結果が出てしまいます。

Sfidante

総合スコア90

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2015/07/10 04:56

データベースに「新宿駅」というデータで「Aさん」が格納されている場合、
『新宿駅』で検索をかけると、
”新宿”で検索した時に引っかかり、
”宿駅”で検索した時にも引っかかり、
結果として、「Aさん」が2回抽出されてしまいます。

該当するコードは下記になります。

lang

1//例えば新宿駅というパラメータを取得したとします。 2String place = request.getParameter("新宿駅"); 3//NgramクラスのcreateNgramメソッドで処理します 4 Map<String, Integer> map = Ngram.createNgram(place, 2); 5//2文字以内は処理されないので、mapにplaceの文字列をそのまま格納します。 6 if(map.size() == 0){ 7 map.put(place , 1); 8 } 9//ここで、繰り返し処理をおこなって検索結果をsetAttributeしてJSPで表示させようとしています。 10 for (Map.Entry<String, Integer> entry : map.entrySet()) { 11 String place_piece = entry.getKey(); 12 tomorrowEngineer.addAll(tomorrowlunchdao.searchTomorrowLunchEngineerList(userid, today, tomorrow, place_piece, duration)); 13 } 14 15 16//Ngramクラス 17public final static Map<String, Integer> createNgram(final String text, final int n) { 18 final String[] words = text.split("", 0); 19 final int numberOfNgram = words.length - n; // 生成されるn-gramの数(ループ回数になる) 20 Map<String, Integer> ngramMap = new HashMap<String, Integer>(); 21 StringBuilder ngramSb = new StringBuilder(); 22 23 // ngramとその出現回数を格納したMapを生成 24 for (int i = 0; i < numberOfNgram; ++i) { 25 // ngramを1つ生成 26 for (int j = i; j < i + n; ++j) { 27 int k = j + 1; 28 ngramSb.append(words[j]).append(words[k]).delete(2, 3); 29 } 30 ngramSb.deleteCharAt(ngramSb.length() - 1); 31 String ngramStr = ngramSb.toString(); 32 ngramSb.delete(0, ngramSb.length()); 33 34 // 生成したngramをMapに入れてカウント 35 if (ngramMap.containsKey(ngramStr)) { 36 ngramMap.put(ngramStr, ngramMap.get(ngramStr) + 1); 37 } else { 38 ngramMap.put(text.substring(text.length()-2) , 1); 39 ngramMap.put(ngramStr, 1); 40 } 41 } 42 ngramSb.append(text.substring(text.length()-2)); 43 return ngramMap; 44 } 45 46//DAOでのtomorrowlunchdao.searchTomorrowLunchEngineerListメソッド 47public List<TomorrowLunchEngineerBeans> searchTomorrowLunchEngineerList(int userid , Timestamp today , Timestamp tomorrow , String place_piece , int duration)throws Exception{ 48 LinkedList<TomorrowLunchEngineerBeans> ll = new LinkedList<TomorrowLunchEngineerBeans>(); 49 String sql = "SELECT userid , engineer_id , (SELECT place FROM tomorrow_lunch_place WHERE word_id = userid)AS place , " 50 + "duration , date , name , photo , age , years_of_experience , " 51 + "projectmanager , projectleader , engineer , programer , director , coder , designer , tester , introduction " 52 + "FROM (SELECT * FROM tomorrow_lunch WHERE date >= ?)AS time " 53 + "JOIN account_user AS au USING(userid) " 54 + "JOIN entry_engineer AS ee USING(userid) " 55 + "JOIN profile_engineer AS pe USING(engineer_id) " 56 + "WHERE date < ? " 57 + "AND duration = ? " 58 + "AND userid IN (SELECT word_id FROM tomorrow_lunch_place WHERE MATCH(ngram) AGAINST(? IN BOOLEAN MODE))" 59 + "AND au.userid NOT IN (SELECT offer_send_userid FROM offer WHERE offer_rec_userid = ?) " 60 + "AND au.userid NOT IN (SELECT offer_rec_userid FROM offer WHERE offer_send_userid = ?) " 61 + "AND au.userid NOT IN (SELECT userid1 FROM room WHERE userid2 = ?) " 62 + "AND au.userid NOT IN (SELECT userid2 FROM room WHERE userid1 = ?) " 63 + "AND userid <> ?"; 64 PreparedStatement ps = connect.prepareStatement(sql); 65 ps.setTimestamp(1, today); 66 ps.setTimestamp(2, tomorrow); 67 ps.setInt(3, duration); 68 ps.setString(4, place_piece); 69 ps.setInt(5, userid); 70 ps.setInt(6, userid); 71 ps.setInt(7, userid); 72 ps.setInt(8, userid); 73 ps.setInt(9, userid); 74 ResultSet rs = ps.executeQuery(); 75 while(rs.next()){ 76 TomorrowLunchEngineerBeans beans = new TomorrowLunchEngineerBeans(); 77 beans.setUserid(rs.getInt("userid")); 78 beans.setEngineerid(rs.getInt("engineer_id")); 79 beans.setPlace(rs.getString("place")); 80 beans.setDuration(rs.getInt("duration")); 81 beans.setDate(rs.getTimestamp("date")); 82 beans.setName(rs.getString("name")); 83 beans.setPhoto(rs.getString("photo")); 84 beans.setAge(rs.getInt("age")); 85 beans.setYears_of_experience(rs.getInt("years_of_experience")); 86 beans.setProjectmanager(rs.getBoolean("projectmanager")); 87 beans.setProjectleader(rs.getBoolean("projectleader")); 88 beans.setEngineer(rs.getBoolean("engineer")); 89 beans.setProgramer(rs.getBoolean("programer")); 90 beans.setDirector(rs.getBoolean("director")); 91 beans.setCoder(rs.getBoolean("coder")); 92 beans.setDesigner(rs.getBoolean("designer")); 93 beans.setTester(rs.getBoolean("tester")); 94 beans.setIntroduction(rs.getString("introduction")); 95 ll.add(beans); 96 } 97 return ll; 98 }

とても長くなってすみません。。。
どこを変更すべきかご教授いただけると幸いです。
何卒よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ごめんなさい、コード自体は詳しく見てないのですが、NGRAMで検索する時は、

lang

1SELECT * FROM table WHERE MATCH(target) AGAINST('+"新宿 宿駅"' IN BOOLEAN MODE);

となるようなクエリを1回発行するのが正しいです。

投稿2015/07/10 14:38

編集2015/07/10 14:41
terushu

総合スコア358

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sfidante

2015/07/11 08:54

ご返信が遅くなり申し訳ございません。 terushu様のおかげで 重複無く取り出すことが出来ます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問