Wybieranie języka podczas tworzenia indeksu pełnotekstowego

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Gdy tworzysz indeks pełnotekstowy, określ język na poziomie kolumn dla kolumny. Zapytania pełnotekstowe względem kolumny używają modułu dzielenia wyrazów i modułów tematyzujących dla określonego języka. Zastanów się, jak Full-Text Engine tokenizuje, a następnie indeksuje Twój tekst, gdy wybierasz język kolumn.

Uwaga / Notatka

Aby określić język na poziomie kolumny dla kolumny indeksu pełnotekstowego, użyj LANGUAGE <language_term> klauzuli podczas określania kolumny. Aby uzyskać więcej informacji, zobacz CREATE FULLTEXT INDEX i ALTER FULLTEXT INDEX.

Ta sekcja zawiera wprowadzenie do modułów dzielenia wyrazów i stemmerów oraz omawia, w jaki sposób usługa Full-Text Search wykorzystuje identyfikator kodu języka (LCID) dla języka ustawionego na poziomie kolumny.

Wprowadzenie do modułów podziału wyrazów i stemmerów

SQL Server Database Engine zawiera łamacze słów i stemmery dla wielu języków, domyślnie włączone. Grupa języka naturalnego firmy Microsoft (NLG) implementuje i obsługuje te składniki językowe. Listę obsługiwanych języków można znaleźć w sys.fulltext_languages.

Zewnętrzne komponenty, takie jak łamacze słów i filtry, powinny być podpisane, aby poprawić bezpieczeństwo. Aby zweryfikować podpisanie, przeprowadź następujące oświadczenie:

EXECUTE sp_fulltext_service 'verify_signature';

Jak Full-Text Search używa nazwy języka na poziomie kolumny

Gdy tworzysz indeks pełnotekstowy, określ prawidłową nazwę języka dla każdej kolumny. Jeśli nazwa języka jest poprawna, ale widok katalogu sys.fulltext_languages jej nie zwraca, Full-Text Search wraca do najbliższej dostępnej nazwy języka tej samej rodziny językowej, jeśli taka istnieje. W przeciwnym razie wyszukiwanie pełnotekstowe przechodzi na neutralny separator wyrazów. Aby uniknąć tego zachowania awaryjnego, określ ważną i dostępną nazwę języka.

Uwaga / Notatka

Identyfikator LCID jest używany dla wszystkich typów danych kwalifikujących się do indeksowania pełnotekstowego (na przykład char lub nchar). Jeśli dla kolumny typu char, varchar lub text ustawiono porządek sortowania dla języka innego niż język określony przez identyfikator LCID, identyfikator LCID i tak jest używany podczas indeksowania pełnotekstowego i wykonywania zapytań względem tych kolumn.

Dzielenie wyrazów

Moduł dzielenia wyrazów dzieli tekst poddawany indeksowaniu na tokeny według granic wyrazów, które są zależne od języka. W związku z tym sposób dzielenia wyrazów różni się w zależności od języka. Jeśli używasz jednego języka, x, do indeksowania kilku języków {x, yi z}, niektóre zachowania mogą spowodować nieoczekiwane wyniki. Na przykład myślnik (-) lub przecinek (,) mogą być elementami podziału wyrazu, które w jednym języku są pomijane, a w innym nie. Rzadko może wystąpić nieoczekiwane zachowanie związane z pochodzeniem, ponieważ dane słowo może pochodzić inaczej w różnych językach. Na przykład w języku angielskim granice wyrazów są zwykle białym znakiem lub jakąś formą interpunkcji. W innych językach, takich jak niemiecki, słowa lub znaki mogą być łączone. W związku z tym wybrany język na poziomie kolumny powinien reprezentować język, który ma być przechowywany w wierszach tej kolumny.

Języki zachodnie

W przypadku zachodniej rodziny języków, jeśli nie masz pewności, które języki będą przechowywane w kolumnie lub oczekujesz, że więcej niż jeden będzie przechowywanych, ogólnym obejściem jest użycie wyłącznika wyrazów dla najbardziej złożonego języka, który może być przechowywany w kolumnie.

Na przykład możesz oczekiwać przechowywania zawartości w języku angielskim, hiszpańskim i niemieckim w jednej kolumnie. Te trzy zachodnie języki posiadają podobne wzorce łamania wyrazów, a niemieckie wzorce są najbardziej złożone. Dlatego w tym przypadku dobrym wyborem jest użycie niemieckiego łamacza słów, który poprawnie przetwarza tekst angielski i hiszpański. Natomiast angielski moduł dzielenia wyrazów może nie przetwarzać poprawnie tekstu niemieckiego ze względu na niemieckie wyrazy złożone.

Użycie podziału wyrazów najbardziej złożonego języka w rodzinie języków nie gwarantuje doskonałego indeksowania każdego języka w rodzinie. Mogą wystąpić przypadki brzegowe, w których nawet najbardziej zaawansowany mechanizm dzielenia wyrazów nie potrafi poprawnie przetwarzać tekstu napisanego w innym języku.

Języki niezachodnie

W przypadku języków nie-zachodnich (takich jak chiński, japoński, hindi itd.) poprzednie obejście niekoniecznie działa, z powodów językowych. W przypadku języków niezachodnich rozważ jedno z następujących obejść:

  • W przypadku języków z różnych rodzin

    Jeśli kolumna może zawierać znacznie różne języki, na przykład hiszpański i japoński, rozważ przechowywanie zawartości różnych języków w osobnych kolumnach. Taki podział umożliwia użycie modułu podziału wyrazów dla danego języka dla każdej kolumny. Jeśli wybierzesz to rozwiązanie i nie znasz języka zapytań w czasie zapytania, może być konieczne wysłanie zapytania względem obu kolumn, aby upewnić się, że zapytanie znajdzie właściwy wiersz lub dokument.

  • Dla treści binarnych (takich jak dokumenty Microsoft Word)

    Gdy indeksowana zawartość ma typ binarny, filtr wyszukiwania pełnotekstowego, który przetwarza treść tekstową przed przekazaniem jej do modułu podziału wyrazów, może uwzględniać określone znaczniki językowe w pliku binarnym. W takim przypadku w czasie indeksowania filtr emituje prawy identyfikator LCID dla dokumentu lub sekcji dokumentu. Mechanizm Full-Text następnie wywołuje moduł dzielenia wyrazów dla języka o tym identyfikatorze LCID. Jednak po indeksowaniu treści wielojęzycznych, należy zweryfikować, czy treść została poprawnie zindeksowana.

  • W przypadku zawartości zwykłego tekstu

    Gdy zawartość jest zwykły tekst, możesz przekonwertować ją na typ danych XML i dodać tagi języka wskazujące język odpowiadający każdemu konkretnemu dokumentowi lub sekcji dokumentu. Aby to zadziałało, musisz jednak znać język przed indeksowaniem pełnotekstowym.

Wynikające

Kolejną kwestią przy wyborze języka na poziomie kolumny jest stemming. Stemming w zapytaniach pełnotekstowych to proces wyszukiwania wszystkich form fleksyjnych danego słowa w określonym języku. Gdy używasz ogólnego modułu dzielenia wyrazów podczas przetwarzania kilku języków, proces stemmingu działa tylko dla języka określonego dla danej kolumny, a nie w przypadku innych języków w tej kolumnie. Na przykład niemieckie stemmery nie działają w przypadku języka angielskiego ani hiszpańskiego (i tak dalej). To zachowanie może wpływać na skuteczność wyszukiwania w zależności od tego, który język wybierzesz w momencie wpisywania zapytania.

Innym zagadnieniem w wyborze języka jest to, jak są reprezentowane dane. W przypadku danych, które nie są przechowywane w kolumnie varbinary(max), nie jest wykonywane żadne specjalne filtrowanie. Zamiast tego tekst jest zazwyczaj przekazywany do składnika dzielenia wyrazów w niezmienionej postaci.

Ponadto moduły dzielenia tekstu na wyrazy służą głównie do przetwarzania tekstu pisanego. Jeśli Twój tekst zawiera znaczniki (np. HTML), dokładność językowa podczas indeksowania i wyszukiwania może być zmniejszona. W takim przypadku masz dwie opcje: preferowaną metodą jest przechowywanie danych tekstowych w kolumnie varbinary(max) oraz wskazanie typu dokumentu, aby mogły być filtrowane. Jeśli takie podejście nie wchodzi w grę, rozważ użycie neutralnego łamacza słów i, jeśli to możliwe, dodanie znaczników (takich jak „br” w HTML) do list słów ignorowanych.

Uwaga / Notatka

Stemming oparty na języku nie ma zastosowania, gdy określasz język neutralny.

Określ język inny niż domyślny dla kolumny w zapytaniu pełnotekstowym

Domyślnie, w Database Engine, Full-Text Search analizuje wyrazy zapytań, używając języka określonego dla każdej kolumny w klauzuli pełnej tekstu. Aby zastąpić to domyślne działanie, podczas wykonywania zapytania określ język inny niż domyślny. W przypadku obsługiwanych języków, których zasoby są zainstalowane, klauzula LANGUAGE <language_term> zapytania CONTAINS, CONTAINSTABLE, FREETEXT lub FREETEXTTABLE może służyć do określenia języka używanego do dzielenia wyrazów, stemingu, korzystania z tezaurusa i przetwarzania wyrazów pomijanych dla terminów zapytania.