2009-06-01 8 views
6

Sto tentando di implementare una funzionalità simile a "Domande correlate" su StackOverflow.Qual è l'SQL utilizzato per eseguire una ricerca simile a "Domande correlate" su Stackoverflow

Come faccio a scrivere l'istruzione SQL che cercherà nel campo Titolo e Riepilogo del mio database domande simili?

Se le mie domande sono: "Qual è l'SQL utilizzato per eseguire una ricerca simile a" Domande correlate "su StackOverflow".

I passaggi che posso pensare sono;

  1. Striscia la virgolette
  2. Spalato la frase in un array di parole ed eseguire una ricerca SQL su ogni parola.

Se lo faccio in questo modo, immagino che non otterrei risultati significativi. Non sono sicuro che la ricerca di testo completo sia abilitata sul server, quindi non la sto usando. Ci sarà un vantaggio nell'uso della ricerca full-text?

Ho trovato una domanda simile, ma non ci fu risposta: similar question

Utilizzando SQL 2005

risposta

1

Dopo aver abilitato la ricerca di testo completo sul mio server SQL 2005, sto utilizzando la seguente stored procedure per cercare testo.

ALTER PROCEDURE [dbo].[GetSimilarIssues] 
(
@InputSearch varchar(255) 
) 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

DECLARE @SearchText varchar(500); 

SELECT @SearchText = '"' + @InputSearch + '*"' 

SELECT PostId, Summary, [Description], 
Created 
FROM Issue 

WHERE FREETEXT (Summary, @SearchText); 
END 
1

Probabilmente riferiscono, basate su tag che si aggiungono alle domande ...

+4

La finestra di dialogo delle domande correlate viene visualizzata quando si immette un titolo, non i tag. –

+0

È vero, cercano nel titolo parole "uniche". Probabilmente filtrano parole come: "come", "il", "che cosa" ecc. E cercano il resto delle parole in altri titoli mentre non prendono in considerazione posizioni di parole. Ma probabilmente cercano anche quelle parole uniche nei tag, quelle corrispondenze sono probabilmente più votate nei risultati di ricerca. – Ropstah

-4

Lo SQL molto bene potrebbe essere solo "SELECT * FROM questions;". Trovo difficile immaginare che l'algoritmo per la ricerca di domande simili sia implementato in SQL.

+0

Vero, ma qualcosa di più costruttivo sarebbe di aiuto qui. Come evidenziato dalle altre risposte, un motore di testo completo sarebbe davvero di aiuto nel fare il lavoro. –

0

Sono abbastanza sicuro che sarebbe più efficace implementare la funzione in base ai tag associati a ciascun post.

+1

Tranne il fatto che esegue la ricerca prima di inserire i tag. –

0

Probabilmente si utilizza una ricerca a testo completo che corrisponde a parole/frasi. L'ho usato in MySQL e SQL Server con discreto successo con funzionalità out of the box.

È possibile trovare maggiori su MySQL ricerche di testo completo a:

http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

O semplicemente google ricerca a testo integrale e troverete un sacco di informazioni.

0

Sembra parola chiave in base al titolo inserito, interrogato su titoli e contenuto di altre domande. Probabilmente è più facile (e più appropriato) fare in Lucene (o simili), quindi in un database relazionale.

0

Direi che probabilmente è una ricerca a testo integrale sul titolo della domanda e il contenuto della domanda e le risposte, utilizzando le singole parole (non l'intero titolo) che inserisci. Quindi, utilizzando le funzioni di classificazione del testo completo, vengono visualizzate le prime 10 domande in ordine di importanza.

Come ha sottolineato tydok, sembra che stiano utilizzando la ricerca full-text (non potrei immaginare in nessun altro modo).

Ecco il MSDN reference on Full-Text Searching, inchiodare la query specifica utilizzata probabilmente non accadrà.

7

Dai un'occhiata a questo podcast.

Uno dei nostri maggiori prestazioni ottimizzazioni per la query “correlata domande” è rimozione della parte superiore 10.000 dizionario più comune Inglese parole (come determinato da Google di ricerca) prima di inviare la query a SQL Server 2008 motore di testo completo. È scioccante quanto poco rimane della maggior parte dei post una volta rimosse le parole del dizionario inglese in alto a 10k . Questo aiuta il limite e restringe i risultati restituiti, , il che rende la query drammaticamente più veloce.

+1

Non si vogliono rimuovere troppe parole 'comuni' - 'net, class, switch, case, data' sono tutti comuni. Prima passerebbe probabilmente a cercare la parola chiave sin la tua domanda e le domande di ricerca con parole chiave similair –

+0

Questo semplicemente supporta la mia risposta (inspiegabilmente downvoted): non si tratta di SQL, si tratta di ciò che è stato fatto prima e dopo l'SQL. –

Problemi correlati