mac mysql ngram_在MySQL中查找最长匹配的ngram
如果我正確理解你的邏輯,這個查詢應該給你正確的結果:
SELECT n1.ngram
FROM
ngrams n1 LEFT JOIN ngrams n2
ON
n2.ngram IN ('stack', 'stack overflow', 'protection')
AND n2.ngram LIKE CONCAT('%', n1.ngram, '%')
AND CHAR_LENGTH(n1.ngram) < CHAR_LENGTH(n2.ngram)
WHERE
n1.ngram IN ('stack', 'stack overflow', 'protection')
AND n2.ngram IS NULL;
請參閱fiddle here.但是,由于我期望你的表可以有很多記錄,而你的單詞列表是有限的,為什么不從執行實際查詢之前從此列表中刪除最短的ngram?我的想法是減少名單
('stack', 'stack overflow', 'protection')
至
('stack overflow', 'protection')
和這個查詢應該做的訣竅:
SELECT *
FROM
ngrams
WHERE
ngram IN (
SELECT s1.ngram
FROM (
SELECT DISTINCT ngram
FROM ngrams
WHERE ngram IN ('stack','stack overflow','protection')
) s1 LEFT JOIN (
SELECT DISTINCT ngram
FROM ngrams
WHERE ngram IN ('stack','stack overflow','protection')
) s2
ON s2.ngram LIKE CONCAT('%', s1.ngram, '%')
AND CHAR_LENGTH(s1.ngram) < CHAR_LENGTH(s2.ngram)
WHERE
s2.ngram IS NULL
);
是的,我查詢表ngram兩次,然后再將結果返回到ngram,因為我們必須確保最長的值實際上存在于表中,但是如果你在ngram列上有一個適當的索引,兩個派生查詢使用DISTINCT應該非常有效:
ALTER TABLE ngrams ADD INDEX idx_ngram (ngram);
小提琴是here。
編輯:
正如samuil正確地指出的,如果你只需要找到最短的ngram,而不是與它相關聯的整行,那么你不需要外部查詢,你可以只執行內部查詢。使用適當的索引,兩個SELECT DISTINCT查詢將非常有效,即使JOIN無法優化(n2.ngram LIKE CONCAT(‘%’,n1.ngram,’%’)也無法利用索引)它將只執行一些已經過濾的記錄,應該是相當快。
總結
以上是生活随笔為你收集整理的mac mysql ngram_在MySQL中查找最长匹配的ngram的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SCN Headroom
- 下一篇: Tomcat9启动闪退