【问题标题】:lucene, or sql fulltext?lucene,还是sql全文?
【发布时间】:2009-10-02 18:13:58
【问题描述】:

我想创建一个搜索网站来搜索文档(包括 pdf 在内的各种格式)、图像、视频和音频。我还希望能够根据作者姓名、日期等条件过滤我的搜索结果。

我在 .NET 中执行此操作,那么启动和运行最简单的方法是什么? SQL全文搜索似乎很诱人,因为我熟悉sql,而且由于我想过滤我的搜索结果,所以很容易存储每个项目的过滤字段。

【问题讨论】:

  • 我还需要从每个搜索结果中获取sn-ps

标签: sql full-text-search lucene


【解决方案1】:

如果您最关心的是快速轻松地启动和运行它,那么 SQL 全文搜索绝对是您的最佳选择。

Lucene.NET 有它的优点,但它绝不是游走于公园的正确设置。文档有点缺乏,网络上的示例数量非常有限。

【讨论】:

  • 谢谢...您知道是否可以使用sql全文搜索返回搜索结果的sn-ps?
  • 是的,你可以这样做。但是你需要一个存储过程。看看这个样本:
【解决方案2】:

sn-ps 的存储过程:

CREATE PROCEDURE SimpleCommentar
  @SearchTerm nvarchar(100),
  @Style nvarchar(200)
AS
BEGIN
  CREATE TABLE #match_docs
  (
    doc_id bigint NOT NULL PRIMA
  );
  INSERT INTO #match_docs
  (
    doc_id
  )
  SELECT DISTINCT
    Commentary_ID
  FROM Commentary
  WHERE FREETEXT 
  (
    Commentary, 
    @SearchTerm, 
    LANGUAGE N'English'
  );
  DECLARE @db_id int = DB_ID(),
    @table_id int = OBJECT_ID(N'
    @column_id int =
    (
      SELECT 
        column_id
      FROM sys.columns
      WHERE object_id = OBJECT_I
        AND name = N'Commentary'
    );
  SELECT
    s.Commentary_ID,
    t.Title,
    MIN
    (
      N'...' + SUBSTRING
      (
        REPLACE
          (
            c.Commentary, 
            s.Display_Term, 
 N'<span style="' + @Style + '">' + s.Display_Term + '</span>'
          ), 
        s.Pos - 512, 
        s.Length + 1024
      ) + N'...'
    ) AS Snippet
  FROM
    (
      SELECT DISTINCT 
        c.Commentary_ID,
        w.Display_Term,
        PATINDEX
          (
            N'%[^a-z]' + w.Display_Term + N'[^a-z]%', 
            c.Commentary
          ) AS Pos, 
        LEN(w.Display_Term) AS Length
      FROM sys.dm_fts_index_keywords_by_document
        (
          @db_id, 
          @table_id
        ) w
      INNER JOIN dbo.Commentary c
        ON w.document_id = c.Commentary_ID
      WHERE w.column_id = @column_id
        AND EXISTS 
          (
            SELECT 1
            FROM #match_docs m
            WHERE m.doc_id = w.document_id 
          )
        AND EXISTS 
          (
            SELECT 1
            FROM sys.dm_fts_parser
              (
                N'FORMSOF(FREETEXT, "' + @SearchTerm + N'")', 
                1033, 
                0, 
                1
              ) p
            WHERE p.Display_Term = w.Display_Term
          )
    ) s
  INNER JOIN dbo.Commentary c
    ON s.Commentary_ID = c.Commentary_ID
INNER JOIN dbo.Book_Commentary bc
    ON c.Commentary_ID = bc.Commentary_ID
  INNER JOIN dbo.Book_Title bt
    ON bc.Book_ID = bt.Book_ID
  INNER JOIN dbo.Title t
    ON bt.Title_ID = t.Title_ID
  WHERE t.Is_Primary_Title = 1
  GROUP BY
    s.Commentary_ID,
    t.Title;
  DROP TABLE #match_docs;
END;

【讨论】:

    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多