Vă mulțumim pentru susținere

Cum obțineți căutări de tip full-text de tip wildcard pentru a lucra în SQL Server?

Note: I am using SQL's Full-text search capabilities, CONTAINS clauses and all - the * is the wildcard in full-text, % is for LIKE clauses only.

Am citit în mai multe locuri că căutările de tip "wildcard" (de ex., Folosind "overflow" pentru a se potrivi cu "stackoverflow") nu sunt acceptate în MS SQL. Mă gândesc să folosesc un Funcția CLR pentru a adăuga potrivirea pentru regex , dar sunt curios să văd ce alte soluții pot avea oamenii.

More Info: You can add the asterisk only at the end of the word or phrase. - along with my empirical experience: When matching "myvalue", "my*" works, but "(asterisk)value" returns no match, when doing a query as simple as:

SELECT * FROM TABLENAME WHERE CONTAINS(TextColumn, '"*searchterm"');

Astfel, nevoia mea de rezolvare. Folosesc doar căutarea în site-ul meu pe o pagină de căutare reală - așa că trebuie să funcționeze practic în același mod în care funcționează Google (în ochii unui utilizator de tip Joe Sixpack). Nu este la fel de complicat, dar acest tip de meci nu ar trebui să eșueze.

0
adăugat editat

12 răspunsuri

Problema cu vederile Wildcards: Nu pot fi indexate, de aceea faceți o scanare completă a meselor.

0
adăugat

Folosind caracterul "%" am căutat în baza noastră de date folosind ceva de genul:

SELECT name FROM TblNames WHERE name LIKE '%overflow'

Utilizarea acestui formular sau a unei interogări poate fi lentă uneori, dar o folosim doar pentru căutarea manuală ocazională.

0
adăugat

Un lucru care merită să rețineți este că interogările de tip "wildcard" se găsesc într-o primă de performanță semnificativă, în comparație cu alte utilizări ale "wildcard" -urilor.

0
adăugat

% Se potrivește cu orice număr de caractere     _ Se potrivește cu un singur caracter

Nu am folosit niciodată indexarea Full-Text, dar puteți realiza interogări destul de complexe și rapide de căutare folosind pur și simplu funcțiile de construire în șir T-SQL.

0
adăugat

Din SQL Server Books Online:

Pentru a scrie interogări text întreg în   Microsoft SQL Server 2005, trebuie   aflați cum să utilizați CONTAINS și   FREETEXT Predicatele Transact-SQL și   CONTAINTABIL și FREETEXTABIL   funcții valoroase.

Aceasta înseamnă că toate interogările scrise mai sus cu% și _ nu sunt interogări de text complete.

Iată o probă a ceea ce arată o interogare atunci când apelați funcția CONTAINSTABLE.

SELECT RANK, * FROM TableName,   CONTAINSTABLE (TableName, *,   "WildCard") searchTable WHERE     [KEY] = TableName.pk ORDER BY     searchTable.RANK DESC

Pentru ca funcția CONTAINSTABLE să știe că folosesc o căutare cu metacaractere, trebuie să o înfășoară în ghilimele duble. Pot să folosesc caracterul * cu machetă la început sau la sfârșit. Există multe alte lucruri pe care le puteți face când construiți șirul de căutare pentru funcția CONTAINSTABLE. Puteți căuta un cuvânt în apropierea unui alt cuvânt, căutați cuvinte înclinate (unitate, condus, condus și condus) și căutați sinonimul unui alt cuvânt (metalul poate avea sinonime, cum ar fi aluminiu și oțel).

Tocmai am creat un tabel, am pus un index de text complet pe masă și am făcut câteva căutări de testare și nu am avut o problemă, așa că căutarea cu metacaractere funcționează conform destinației.

[Actualizați]

Văd că v-ați actualizat întrebarea și știți că trebuie să utilizați una dintre funcții.

Încă puteți căuta cu wildcard-ul la început, dar dacă cuvântul nu este un cuvânt complet urmând wildcard-ul, trebuie să adăugați un alt marcaj la sfârșit.

Example:  "*ildcar" will look for a single word as long as it ends with "ildcar".

Example:  "*ildcar*" will look for a single word with "ildcar" in the middle, which means it will match "wildcard".  [Just noticed that Markdown removed the wildcard characters from the beginning and ending of my quoted string here.]

[Update # 2]

Dave Ward - Folosirea unui wildcard cu una dintre funcții nu ar trebui să fie o lovitură imensă. Dacă am creat un șir de căutare cu doar "*", nu va returna toate rândurile, în cazul testului meu, a returnat 0 înregistrări.

0
adăugat
@Jagd - Oferiți un răspuns mai bun atunci.
adăugat autor Greg Hurlman
Când am pus această întrebare, sa bazat pe modul în care SQL 2005 a tratat indicele textului integral, motiv pentru care am făcut referire la Books 2005 Online.
adăugat autor Otto
Nu sunteți sigur de ce acest lucru este marcat ca răspuns, deoarece nu este complet corect. Caracterele wildcard nu funcționează în cazul unei căutări în text întreg. Verificați acest lucru în SQL Server 2008 pe un index full-text utilizând funcția contentstable. Vedeți răspunsul / postul lui Michael Stum pentru o înțelegere de ce.
adăugat autor Jagd
Ceea ce este de remarcat aici este citatele duble din interiorul citatelor simple. Funcția mea inițială a avut "termen *", dar NU funcționa. Cu toate acestea, "termenul" "nu". Mulțumiri
adăugat autor Yablargo
Nu pot reproduce acest lucru în SQL 2005. Folosind un * în partea din față a șirului de căutare, după cum se arată, rezultă că nu s-au returnat rânduri.
adăugat autor gregmac
un wildcard de tip leading nu funcționează în sqlserver, deci acest răspuns este incorect atunci când este privit din perspectiva întrebării inițiale.
adăugat autor Evert
Acceptat cu @ Jagd, acest lucru ar trebui să fie votat și să nu fie marcat ca răspuns. OP este în mod clar vorbind despre indexurile FT (de aici și * ca wildcard) și este pur și simplu incorect să afirmăm că * funcționează ca prefix într-o operație de index FT. Fericit să se dovedească greșit, dar nu credeți că sunt.
adăugat autor John B

Caracterul wildcard în SQL Server este semnul % și funcționează bine, conducând, trailing sau altfel.

Acestea fiind spuse, dacă veți face orice fel de căutare serioasă completă a textului, atunci aș lua în considerare utilizarea funcțiilor Full Text Index. Utilizarea cardurilor wildcard % și _ va face ca baza dvs. de date să aibă o lovitură de performanță serioasă.

0
adăugat

Când vine vorba de căutarea full-text, pentru banii mei nimic nu bate Lucene . Există un port .Net disponibil care este compatibil cu indexurile create cu Java versiune.

Există o mică lucrare implicată în faptul că trebuie să creați / mențineți indexurile, însă viteza de căutare este fantastică și puteți crea tot felul de interogări interesante. Chiar și viteza de indexare este destul de bună - tocmai ne reconstruim complet indiciile o dată pe zi și nu ne îngrijorăm să le actualizăm.

Ca exemplu, această funcție de căutare este alimentat de Lucene.Net.

0
adăugat

Soluție alternativă numai pentru conducătorul wildcard:

  • store the text reversed in a different field (or in materialised view)
  • create a full text index on this column
  • find the reversed text with an *

    SELECT * 
    FROM TABLENAME 
    WHERE CONTAINS(TextColumnREV, '"mrethcraes*"');
    

Desigur, există multe dezavantaje, doar pentru o soluție rapidă ...

Să nu mai vorbim de CONTAINSTABLE ...

0
adăugat

Doar FYI, Google nu face nici o căutări substring sau trunchiere, dreapta sau stânga. Ei au un caracter wildcard * pentru a găsi cuvinte necunoscute într-o frază, dar nu un cuvânt.

Google, împreună cu majoritatea motoarelor de căutare fulltext, stabilește un index inversat, bazat pe ordinea alfabetică a cuvintelor, cu linkuri către documentele sursă. Căutare binară este rapidă, chiar și pentru indici imense. Dar este foarte dificil să faci o trunchiere în stânga în acest caz, deoarece pierde avantajul indexului.

0
adăugat

Pentru a adăuga clar acest subiect, din testarea mea pe 2008 R2, Franjo este corect mai sus. Atunci când se ocupă de căutarea textului complet, cel puțin atunci când se folosește fraza CONTAINS, nu puteți utiliza funcțional funcția de conducere, numai funcția finală . * este wildcard, nu% în textul complet.

Unii au sugerat că * este ignorat. Asta nu pare a fi cazul, rezultatele mele par să demonstreze că funcționalitatea * încetează să funcționeze. Cred că conducerea * este ignorată de motor.

Problema mea adăugată este totuși că aceeași interogare, cu o valoare * de sfârșit, care folosește textul integral cu metacaractere, a funcționat relativ rapid în 2005 (20 secunde) și a încetinit la 12 minute după migrarea db la 2008 R2. Se pare că cel puțin un alt utilizator a obținut rezultate similare și a început un forum pe care l-am adăugat la ... FREETEXT funcționează rapid, dar ceva "se pare" sa schimbat odată cu modul în care procesele 2008 se încheie * în CONTAINS. Ei dau tot felul de avertismente în "Upgrade Advisor" că "au îmbunătățit" TEXTUL FULL, astfel încât codul tău s-ar putea rupe, dar, din păcate, nu vă avertizează cu privire la anumite coduri depreciate etc ... doar o avertizare că l-au schimbat, Folosiți pe propria răspundere.

http: //social.msdn .microsoft.com / Forum / ar-SA / sqlsearch / filet / 7e45b7e4-2061-4c89-af68-febd668f346c

Maybe, this is the closest MS hit related to these issues... http://msdn.microsoft.com/en-us/library/ms143709.aspx

0
adăugat

Ca parametru într-o procedură stocată, îl puteți folosi ca:

ALTER procedure [dbo].[uspLkp_DrugProductSelectAllByName]
(
    @PROPRIETARY_NAME varchar(10)
)
as
    set nocount on
    declare @PROPRIETARY_NAME2 varchar(10) = '"' + @PROPRIETARY_NAME + '*"'

    select ldp.*, lkp.DRUG_PKG_ID
    from Lkp_DrugProduct ldp
    left outer join Lkp_DrugPackage lkp on ldp.DRUG_PROD_ID = lkp.DRUG_PROD_ID
    where contains(ldp.PROPRIETARY_NAME, @PROPRIETARY_NAME2)
0
adăugat

Poate că următorul link va oferi răspunsul final la această utilizare a metacaracterelor: Efectuarea căutărilor Wildcard FTS .

Notați pasajul care afirmă: "Cu toate acestea, dacă specificați? Chain? Sau? Ch ain ?, nu veți obține rezultatul așteptat. Asteriscul va fi considerat ca o marcă de punctuație obișnuită, . "

0
adăugat