Полнотекстовый поиск SQL Server

в зависимости от того, что вы хотите извлечь из таблицы, вот как вы можете играть с данными

numLines <- R.utils::countLines("sportsdb_sample_mysql_20080303.sql")
# [1] 81266

linesInDB <- readLines("sportsdb_sample_mysql_20080303.sql",n=60)

. Затем вы можете сделать некоторое регулярное выражение для получения имен таблиц (после CREATE TABLE), имена столбцов (между первыми скобками) и VALUES (строки после CREATE TABLE и между вторыми скобками)

Ссылка: Обратное проектирование вывод mysqldump с MySQL Workbench дает оператор «quot», начинающийся с заостренной строки, содержит не UTF8 символы & Quot; error


EDIT: в ответ на ответ OP, если я правильно интерпретирую скрипт python, он также читает строку за строкой, фильтрует строки INSERT INTO, анализирует как csv, затем пишите в файл. Это очень похоже на мое первоначальное предложение. Моя версия ниже в R. Если размер файла слишком велик, было бы лучше прочитать в файле куски, используя другой R-пакет

options(stringsAsFactors=F)
library(utils)
library(stringi)
library(plyr)

mysqldumpfile <- "sportsdb_sample_mysql_20080303.sql"

allLines <- readLines(mysqldumpfile)
insertLines <- allLines[which(stri_detect_fixed(allLines, "INSERT INTO"))]
allwords <- data.frame(stri_extract_all_words(insertLines, " "))
d_ply(allwords, .(X3), function(x) {
    #x <- split(allwords, allwords$X3)[["baseball_offensive_stats"]]
    print(x[1,3])

    #find where the header/data columns start and end
    valuesCol <- which(x[1,]=="VALUES")
    lastCols <- which(apply(x, 2, function(y) all(is.na(y))))
    datLastCol <- head(c(lastCols, ncol(x)+1), 1) - 1

    #format and prepare for write to file
    df <- data.frame(x[,(valuesCol+1):datLastCol])
    df <- setNames(df, x[1,4:(valuesCol-1)])
    #type convert before writing to file otherwise its all strings
    df[] <- apply(df, 2, type.convert)
    #write to file
    write.csv(df, paste0(x[1,3],".csv"), row.names=F)
})

12
задан 10 revs, 7 users 49% 1 November 2012 в 10:07
поделиться

5 ответов

Спасибо за парней ответов мне наконец удалось заставлять это работать. С частью и Biri и ответов Kibbee. Я должен был добавить * к строке и разбить ее на пробелы для работы. Таким образом в конце я добрался

....
@Name nvarchar(100),
....
--""s added to prevent crash if searching on more then one word.
DECLARE @SearchString varchar(100)

--Added this line
SET @SearchString = REPLACE(@Name, ' ', '*" OR "*')
SET @SearchString = '"*'+@SearchString+'*"'

SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;  
....

Существует больше полей, искавших на, я просто упростил его для вопроса, извините о котором, я не думал, что это произведет ответ. Это на самом деле ищет столбец, который имеет csv псевдонимов и столбца примечаний также.

Спасибо за справку.

3
ответ дан 2 December 2019 в 20:43
поделиться

Если Вы просто ищете имена людей, это могло бы быть в Ваших интересах даже не использовать полнотекстовый индекс. Полнотекстовый индекс имеет смысл, когда у Вас есть поля крупного текста, но если бы Вы главным образом имеете дело с одним словом на поле, я не уверен, насколько дополнительный Вы вышли бы из полнотекстовых индексов. Ожидание полнотекстового индекса для переиндексации себя, прежде чем можно будет искать новые записи, может быть одной из многих проблем.

Вы могли просто сделать запрос, такой как следующее. Разделите свой searchstring на пробелах и создайте список критериев поиска.

Select FirstName,MiddleName,LastName 
From person 
WHERE 
Firstname like @searchterm1 + '%'
or MiddleName like @searchterm1 + '%'
or LastName like @searchterm1 + '%'
or Firstname like @searchterm2 + '%'
etc....
4
ответ дан 2 December 2019 в 20:43
поделиться

FreeTextTable должен работать.

INNER JOIN FREETEXTTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 

@SearchString должен содержать значения как 'Жаркое Phillip' (одна длинная строка, содержащая все строки поиска, разделенные пробелами).

Если требуется искать франк или Phil, необходимо использовать звездочку: Phil* и франк*

'Phil' ищет точно слово 'Phil'. 'Phil*' ищет каждое слово, которое запускается с 'Phil'

4
ответ дан 2 December 2019 в 20:43
поделиться

Другой подход мог быть должен абстрагировать поиск далеко от отдельных полей.

Другими словами, создайте представление о своих данных, которые поворачивают все поля разделения как firstname lastname в связанные поля т.е. full_name

Затем поиск на представлении. Это, вероятно, сделало бы поисковый запрос более простым.

2
ответ дан 2 December 2019 в 20:43
поделиться

Вы могли бы хотеть проверить Lucene.net как альтернативу Полному тексту.

2
ответ дан 2 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: