最优化的使用Lambda搜索列的一组关键字的方法

时间:2015-03-12 14:56:10

标签: c# entity-framework linq-to-entities

我需要在表格中搜索与List<string>中包含的一组关键字匹配的行(目前有300 000行,文本长度为100到50000个字符)。关键字列表通常为2-6个单词(来自用户输入的自由文本字段)。

我现在这样做:

List<string> wordsToFind = new List<string>() { "word1", "word2" };
var matches = db.Posts.Where(x => wordsToFind.All(z => x.Text.Contains(z)));

我有两个问题。

  1. 能否以更有效的方式完成?
  2. 有没有一个很好的方法来获得帖子的%命中率。即,如果文本中存在所有关键字,那么它是100%匹配,如果只有1/2个单词匹配则是50%匹配(我想用它来对结果进行排序并向用户显示)。
  3. 我问的原因是,在一台拥有16 Gb ram的octacore SQL服务器上,只运行这个数据库,搜索8000条记录需要20秒才能找到两个单词。

    出于好奇,我检查了这个生成的SQL,这可能和它一样有效吗?

    SELECT
      *
    FROM [dbo].[Posts] AS [Extent1]
    WHERE NOT EXISTS (SELECT
      1 AS [C1]
    FROM (SELECT
      N'word1' AS [C1]
    FROM (SELECT
      1 AS X) AS [SingleRowTable1]
    UNION ALL
    SELECT
      N'word2' AS [C1]
    FROM (SELECT
      1 AS X) AS [SingleRowTable2]) AS [UnionAll1]
    WHERE (NOT ((CAST(CHARINDEX([UnionAll1].[C1], [Extent1].[Text]) AS int)) > 0))
    OR (CASE
      WHEN ((CAST(CHARINDEX([UnionAll1].[C1], [Extent1].[Text]) AS int)) > 0) THEN CAST(1 AS bit)
      WHEN (NOT ((CAST(CHARINDEX([UnionAll1].[C1], [Extent1].[Text]) AS int)) > 0)) THEN CAST(0 AS bit)
    END IS NULL))
    

0 个答案:

没有答案