Frage Volltextsuche Nur gelegentliches Suchen nach Wörtern


Ich habe eine Tabelle mit einem Volltextindex. Diese Abfrage gibt 2 Ergebnisse zurück:

SELECT *
FROM SampleTable
WHERE ContentForSearch LIKE '% mount %'
ORDER BY 1

Diese Abfrage gibt 1 Ergebnis zurück:

SELECT *
FROM SampleTable
WHERE CONTAINS(ContentForSearch, '"mount"')
ORDER BY 1

Das Hinzufügen einer neuen Instanz des Wortes "mount" zur Tabelle wird in der Suche angezeigt. Warum?

Ich habe die Stoppwörterliste so gut wie möglich überprüft. Dies gibt keine Ergebnisse zurück:

SELECT *
FROM sys.fulltext_stoplists

Dies gibt keine Ergebnisse zurück:

SELECT *
FROM sys.fulltext_system_stopwords
WHERE stopword like '%mount%'

Ich überprüfte auch, ob der Index auf dem neuesten Stand war, dies gab die aktuelle Zeit (minus ein paar Minuten) und eine 0 zurück, die Leerlauf anzeigte:

SELECT DATEADD(ss, FULLTEXTCATALOGPROPERTY('SampleTableCatalog','PopulateCompletionAge'), '1/1/1990') AS LastPopulated,
    FULLTEXTCATALOGPROPERTY('SampleTableCatalog','PopulateStatus')

Ich habe auch einige Suchen in der Zeichenfolge durchgeführt, die nicht im CONTAINS-Ergebnis angezeigt wird, um festzustellen, ob die ASCII-Werte seltsam waren (und bei Bedarf Abfragen bereitstellen können), aber sie waren genau die gleichen wie die, die angezeigt wurden.

Auf einer Kopie der Datenbank lief jemand:

ALTER FULLTEXT INDEX ON SampleTable SET STOPLIST = OFF;
ALTER FULLTEXT INDEX ON SampleTable SET STOPLIST = SYSTEM;

und das schien es zu beheben, aber ich habe keine Ahnung warum und ich fühle mich unbehaglich, Veränderungen zu machen, die ich nicht verstehe.

AKTUALISIEREN Stolegs Kommentare führten mich schließlich zu der Lösung. Die Volltextindizierung wurde auf einem bestimmten Datenbankserver irgendwie deaktiviert. Wenn diese Datenbank dann auf einem anderen Server wiederhergestellt wurde, wurden die Einträge, die auf dem ersten Server nicht indexiert wurden, immer noch nicht indiziert, obwohl der neue Server den Index ordnungsgemäß aktualisiert hatte. Ich fand das, indem ich Stolegs Abfragen verwendete, um zu überprüfen, welche Zeilen im Index fehlten, und dann das Änderungsdatum für diese Zeilen zu überprüfen (die glücklicherweise gespeichert wurden). Mir ist aufgefallen, dass das Muster, das aus den Daten stammt, als sich die Datenbank auf dem anderen Server befand, nicht im Index enthalten war. Die Lösung auf dem Problemserver bestand darin, die Volltextindizierung zu aktivieren und die Kataloge neu zu erstellen. Wie die Indizierung abgestellt wurde, verstehe ich selbst nicht. Der Kommentar des DBA zu seiner Lösung lautete: "Ich habe die Volltextsuche als Ressource zum Clusterknoten hinzugefügt."


7
2017-08-13 13:59


Ursprung


Antworten:


Nun, die offensichtliche Frage ist: Ist 'mount' in deiner Stoppliste?

Microsoft Konfigurieren und Verwalten von Stoppwörtern und Stopplisten für die Volltextsuche zeigt Ihnen, wie Sie Ihre Stoppwörter abfragen und aktualisieren können.

Vielleicht möchten Sie auch die allgemeine Informationen zur Sperrliste von Microsoft.

HINZUGEFÜGT

Nimm dich nicht als Beleidigung (nicht dass du beleidigt klangst). Viel zu oft sagen die Leute, dass sie etwas überprüft haben, wenn sie nur dachten, dass sie es hätten - wenn sie auf die falsche Datenbank usw. schauen. Also wollten Sie sichergehen. Ich interpretierte deine Zeit als Arbeiten mit Like, nicht mit Contains, also dachte ich, es wäre eher die Stoppliste.

Die einzige andere "offensichtliche" Lösung wäre, den Volltextindex neu zu erstellen - mit dem Gedanken, dass das Ändern der Sperrliste die gleiche Auswirkung auf die andere Datenbank hat. Ich nehme an, Sie könnten den Server auch zuerst neu starten. Aber als eine andere mysteriöse Lösung, keine erste Wahl.


1
2017-08-13 16:25



Ändert die Volltext-Stoppliste, die dem Index zugeordnet ist, falls vorhanden.

AUS
  Gibt an, dass dem Volltextindex keine Stoppliste zugeordnet werden soll.

SYSTEM
  Gibt an, dass das Standard-Volltextsystem STOPLIST für diesen Volltextindex verwendet werden soll.

stoplist_name
  Gibt den Namen der Stoppliste an, die dem Volltextindex zugeordnet werden soll.

Weitere Informationen finden Sie unter Konfigurieren und Verwalten von Stoppwörtern und Stopplisten für die Volltextsuche.

Dies wurde nur entfernt und die Stoppliste auf Systemstandard zurückgesetzt.


0
2017-08-19 03:18



Es ist wegen der zusätzlichen Leerzeichen in '% mount%' Versuchen:

SELECT * FROM SampleTable WHERE ContentForSearch LIKE '%mount%' ORDER BY 1


0
2017-08-22 15:57