2008-08-17 82 views
5

我一直在試圖找到一種簡單的方法來解析搜索查詢並將其轉換爲我的數據庫的SQL查詢。解析Java中的搜索查詢

我發現兩種解決方案:

  1. Lucene:功能強大的基於Java的搜索引擎,包含查詢分析器,但它不是很容易配置,我可以找到一個方法來破解輕鬆/與之相適應創建SQL查詢。
  2. ANTLR:經驗豐富的文本詞法分析器。用於編譯任何東西,從編譯器到天空刮板。 ANTLR是高度可配置的,但是從現在開始,每個人都會接觸到代碼將不得不學習一門新的語言......

其他想法?

回答

0

取決於您需要解析的查詢類型,以及數據庫中數據的結構。我假設你不是試圖在數據庫中進行全文搜索(即整個數據庫中的搜索引擎),因爲大多數信息檢索人員會告訴你,這樣的表現很糟糕。倒轉索引肯定是這樣做的最好方法。

告訴我們更多關於實際問題的信息:用戶要輸入什麼內容,他們期望輸出什麼內容以及數據模型是什麼樣的。設計一個沒有這些信息的搜索解決方案,你會得到一個非常不理想的結果。

1

你到底在想什麼?我已經使用Lucene進行文本搜索,但它擅長的地方是構建一個索引,並根據而不是來查找數據庫。

我最近設置了一個系統,我在Lucene中通過將所有列(用空格分隔)連接到一個字段中並將其彈出到Lucene中,然後將主鍵添加到單獨列中來索引表中的表。 Lucene執行所有搜索並返回主鍵列表,我使用這些主鍵列出了一組填充的結果並顯示給用戶。

將搜索查詢轉換爲SQL語句在我看來似乎有點混亂。

另外,這裏是a great beginning tutorial explaining the basic structure of Lucene

0

你是對的,假設我不是在尋找全文搜索。 信息看起來是這樣的架構書信息: 名稱:字符串,出版商:字符串,NUM_PAGES INT,出版日期:日期...

的搜索查詢的排序:

  1. 哈里波特(搜索任何書籍衛生組織的名字有哈利和波特)
  2. 出版商:自然*頁> 100(書從開始自然有超過100本書籍出版商)
  3. (「新年」或聖誕節)和禮物(你得到的圖片...)
  4. 物理和發佈> 1/1/2008(新物理學方面的書籍)
1

你可以嘗試使用類似javacc(Java編譯器編譯器)來實現一個解析器或者通過手動只是解析字符串蠻力。每當你遇到一個表達式時,你就把它表示爲一個對象。然後你只需要將你的表達式樹翻譯成where子句。

例如: 「哈利·波特」 成爲

new AndExp(new FieldContainsExp("NAME", "Harry"), new FieldContainsExp("NAME", "Potter") 

和 「出版商:自然*頁> 100」 成爲

new AndExp(new FieldContainsExp("PUBLISHER", "Nature"), FieldGreaterThan("PAGES", 100)) 

然後,一旦你擁有了這些,這是很容易把他們into SQL:

FieldContainsExp.toSQL(StringBuffer sql, Collection<Object> args) { 
    sql.append(fieldName); 
    sql.append(" like "); 
    sql.append("'%?%'"); 
    args.add(value); 
} 

AndExp.toSQL(StringBuffer sql, Collection<Object> args) { 
    exp1.toSQL(sql, args); 
    sql.append(" AND "); 
    exp2.toSQL(sql, args); 
} 

你可以想象其餘的。您可以根據需要嵌套和表達。

3

SQL-ORM是一個非常輕量級Java庫,包括在Java中構造一個(動態)SQL查詢作爲對象

IMHO的曲線圖的能力,這是用於構建動態SQL查詢不是通常的一個更好的技術字符串聯合方法。

聲明:我已經取得了一些非常輕微的貢獻,這個項目

+0

非常有趣。看起來像沒有映射和XML的IBatis – 2008-10-02 03:40:27

0

嘗試結合ORM工具(如OpenJPA)和羅盤(用於OSEM框架)。 它自動索引通過ORM工具完成的更新,併爲您提供Lucene搜索功能。之後,您可以從數據庫中檢索對象。 它超越了任何基於SQL的搜索解決方案。

-2

String [] array;

int checkWord(String searchWord) 
{ 
    for(int i = 0; i < array.length; i++) 
    { 
     if(searchWord.equals(array[i])) 
      return i; 
    } 
    return 0; 

} 
+0

這並沒有真正回答這個問題。 – 2013-09-27 13:02:22