我用火鳥2.5,我必須找到含有任何順序幾行字:在火鳥使用類似於如何發現如果幾個單詞匹配
發現「藍色」 和「房子」:
「藍房子在樹林」 =真 「藍色窗戶房子」 =真 「房子在海灘上」 =假 「藍車」 =真
使用管道「| 「給我或,我需要AND,但以任何順序,不僅有2個字,可能更多 我正在嘗試使用SIMILAR TO,但看起來Firebird中的RegExpr太有限了。
使用幾個喜歡x和喜歡y,是不是喲走,因爲我不知道有多少單詞將不得不找。
我用火鳥2.5,我必須找到含有任何順序幾行字:在火鳥使用類似於如何發現如果幾個單詞匹配
發現「藍色」 和「房子」:
「藍房子在樹林」 =真 「藍色窗戶房子」 =真 「房子在海灘上」 =假 「藍車」 =真
使用管道「| 「給我或,我需要AND,但以任何順序,不僅有2個字,可能更多 我正在嘗試使用SIMILAR TO,但看起來Firebird中的RegExpr太有限了。
使用幾個喜歡x和喜歡y,是不是喲走,因爲我不知道有多少單詞將不得不找。
據我所知,沒有什麼內置於火鳥會幫助你。
你真正需要的是全文搜索。雖然這不是火鳥直接支持,但這裏有一些有用的建議:http://www.firebirdfaq.org/faq328/
祝你好運和抱歉,我沒有更直接的答案。
您可以檢查參考手冊SIMILAR TO但我認爲你需要的是更多像Sphinx
你可以只用火鳥手段解決您的任務。假設,你有唯一場名爲TEST表S.
CREATE TABLE TEST (S VARCHAR(256))
其中包含的短語:
'a blue house in the woods'
'a house with blue windows'
'a house by the beach'
'the blue car'
...
你需要創建一個輔助可選程序SPLIT_WORDS:
CREATE OR ALTER PROCEDURE split_words (S VARCHAR(256))
RETURNS(
K VARCHAR(256),
W VARCHAR(256))
AS
DECLARE VARIABLE B INTEGER = 1;
DECLARE VARIABLE E INTEGER = 1;
DECLARE VARIABLE C CHAR(1);
BEGIN
K = :S;
WHILE (:E <= CHAR_LENGTH(:S)) DO
BEGIN
C = UPPER(SUBSTRING(:S FROM :E FOR 1));
IF (:C < 'A' OR :C > 'Z') THEN
BEGIN
W = SUBSTRING(:S FROM :B FOR (:E - :B));
IF (:W > '') THEN
SUSPEND;
WHILE (:E <= CHAR_LENGTH(:S)) DO
BEGIN
C = UPPER(SUBSTRING(:S FROM :E FOR 1));
IF (:C >= 'A' AND :C <= 'Z') THEN
LEAVE;
E = :E + 1;
END
B = :E;
END
E = :E + 1;
END
W = SUBSTRING(:S FROM :B FOR (:E - :B));
IF (:W > '') THEN
SUSPEND;
END
程序旨在將給定的字符串拆分爲單詞。任何非字母字符都被視爲分隔符。
有了這個程序,人們可以編寫一個查詢,以任何順序返回所有字符串'HOUSE'和'BLUE'。
SELECT
tt.s
FROM
test tt JOIN
(SELECT
t.s, COUNT(s2.w) c
FROM
test t LEFT JOIN split_words(t.s) s ON 1=1
LEFT JOIN split_words('blue house') s2 ON s.w=s2.w
WHERE
s2.w IS NOT NULL
GROUP BY
1
) ttt ON ttt.s = tt.s
WHERE
ttt.c = (SELECT COUNT(*) FROM split_words('blue house'))