2014-12-03 15 views
0

我的遠距離目標是使用MySQL全文索引......但最接近的問題是將text的使用與SQLAlchemy ORM相結合。使用`select()`與`text()`使用ORM相當於什麼?

假設我們有一個User類繼承自聲明基礎,並在MySQL列name上定義了全文索引。以下是工作原理:

from sqlalchemy import text 

full_text = text('MATCH(name) AGAINST(\":name\") > :value') 
filter_arg = full_text.params(name="John Jacob Jingleheimer Schmidt", value=1) 
session.query(User).filter(filter_arg) 

正如docs指出,使用textfilterorder_by很簡單。我想實際選擇值。我想做什麼這是完全虛假的代碼看起來像它應該做到:

full_text = text('MATCH(name) AGAINST(\":name\")') 
value = full_text.params(name="John Jacob Jingleheimer Schmidt") 
session.query(User, value) 

那是不行的,很明顯,但我希望這是不夠清楚暗示的目標是什麼?

回答

0

Column.match功能應該做的工作:

xpr = User.name.match("John Jacob Jingleheimer Schmidt").label("match_result") 
q = session.query(User, xpr) 

事實上,整個查詢包括where子句好得多不使用text()表示:

xpr = User.name.match("John Jacob Jingleheimer Schmidt").label("match_result") 
q = session.query(User, xpr).filter(xpr > 1) 
+0

另外這個擴展可能是有用的:https://github.com/mengzhuo/sqlalchemy-fulltext-search – van 2014-12-03 05:45:35

+0

我剛剛知道自己Column.match,但它似乎只在工作MySQL的布爾模式。所以我無法獲取或過濾特定的值。我會看看擴展。 – Ian 2014-12-03 12:53:08

+0

我不是全文搜索的專家,但布爾模式是構造查詢的方式,並且如您指定的那樣,它將完全匹配單個值。從文檔(http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html):'(no operator) 默認情況下(當既不指定+也不指定) - 單詞是可選,但包含它的行的額定值更高。這模仿MATCH()... AGAINST()中沒有BOOLEAN MODE修飾符的行爲。' – van 2014-12-03 13:05:12

0

添加到接受的答案,對於MySQL後端,您可能需要以下解決方法。

from sqlalchemy import type_coerce, Float 
result = session.query(User, type_coerce(xpr, Float)).all() 

Source

相關問題