Полнотекстовый поиск SQL Server 2008 года на таблице с составным первичным ключом

Я пытаюсь поместить полнотекстовый поиск, работающий над SQL Server 2008, однако таблица, которую я пытаюсь индексировать, является таблицей с составным первичным ключом, чем-то вроде этого:

EXEC sp_fulltext_catalog 'My_Catalog', 'create'
EXEC sp_fulltext_table 'Message', 'create', 'My_Catalog', 'PK__MESSAGES__C87C0C9C0EC32C7A' // PK__MESSAGES__C87C0C9C1EC32C6A is a composite key

и я получаю следующую ошибку:

"'PK __ СООБЩЕНИЯ __ C87C0C9C1EC32C6A' не является допустимым индексом для осуществления ключа полнотекстового поиска. Ключ полнотекстового поиска должен быть уникальным, не допускающим NULL-значения индексом отдельного столбца, который не в режиме офлайн, не определяется на недетерминированном или неточном несохраненном вычисляемом столбце, не имеет фильтра и имеет максимальный размер 900 байтов. Выберите другой индекс для полнотекстового ключа".

Это означает, что я не могу использовать полнотекстовый поиск в таблицах с составными первичными ключами? Или я делаю что-то не так?

5
задан WhatsThePoint 21 November 2018 в 08:51
поделиться

2 ответа

Я думаю, что сообщение об ошибке довольно ясно, нет?

"PK_MESSAGES_C87C0C9C1EC32C6A не является действительным индексом для применения полнотекстового ключ поиска. Ключ полнотекстового поиска должен быть уникальным, не нулевым, одностолбцовый индекс, который не является автономным, не определяется на недетерминированном или неточном неперсистентном вычисляемом столбце, не имеет не имеет фильтра, и имеет максимальный размер 900 байт. Выберите другой индекс для для полнотекстового ключа".

Если ваш индекс не уникален, не является ненулевым и не одноколоночным, он не может быть использован для полнотекстового индексирования.

Это означает, что я не могу использовать полнотекстовый текстовый поиск в таблицах с составными первичными ключами? Или я делаю что-то не так?

Нет, как говорит ошибка - такой индекс не будет работать. Точка. Это невозможно обойти.

Как отметил Remus - здесь не сказано, что это должен быть индекс первичного ключа! Если у вас есть какое-то другое не нулевое и уникальное поле в таблице, вы можете использовать уникальный индекс по этому полю для ваших целей. Вы даже можете просто добавить в таблицу поле INT IDENTITY(1,1) и поместить UNIQUE INDEX на это единственное поле, и все будет в порядке.

9
ответ дан 18 December 2019 в 13:13
поделиться

Объявите bitSet как частную структуру:

type bitSet struct {
  len int
  array []uint64
}

Откройте интерфейс BitSet:

type BitSet interface {
  Has(pos int) bool
  Add(pos int) bool
  Len() int
}

Также откройте функцию NewBitSet:

func NewBitSet(len int) BitSet {
  return &bitSet{len, make(uint64, (len+7) / 8) }
}

Это путь Go для инкапсуляции: разделите интерфейс, а не реализацию.

-121--3007000-

Вы можете проверить этот сайт: http://prettycode.org/2009/11/12/short-guid/

Он выглядит очень близко к тому, что вы делаете.

public class ShortGuid
{
    private readonly Guid guid;
    private readonly string value;

    /// <summary>Create a 22-character case-sensitive short GUID.</summary>
    public ShortGuid(Guid guid)
    {
        if (guid == null)
        {
            throw new ArgumentNullException("guid");
        }

        this.guid = guid;
        this.value = Convert.ToBase64String(guid.ToByteArray())
            .Substring(0, 22)
            .Replace("/", "_")
            .Replace("+", "-");
    }

    /// <summary>Get the short GUID as a string.</summary>
    public override string ToString()
    {
        return this.value;
    }

    /// <summary>Get the Guid object from which the short GUID was created.</summary>
    public Guid ToGuid()
    {
        return this.guid;
    }

    /// <summary>Get a short GUID as a Guid object.</summary>
    /// <exception cref="System.ArgumentNullException"></exception>
    /// <exception cref="System.FormatException"></exception>
    public static ShortGuid Parse(string shortGuid)
    {
        if (shortGuid == null)
        {
            throw new ArgumentNullException("shortGuid");
        }
        else if (shortGuid.Length != 22)
        {
            throw new FormatException("Input string was not in a correct format.");
        }

        return new ShortGuid(new Guid(Convert.FromBase64String
            (shortGuid.Replace("_", "/").Replace("-", "+") + "==")));
    }

    public static implicit operator String(ShortGuid guid)
    {
        return guid.ToString();
    }

    public static implicit operator Guid(ShortGuid shortGuid)
    {
        return shortGuid.guid;
    }
}
-121--1178897-

Ключ полнотекстового поиска должен быть уникальный, не допускающий значения NULL, один столбец индекс, который не находится в автономном режиме, не является определяется на недетерминированном или неточные неупорядоченные вычисленные столбец, не имеет фильтра, и имеет максимальный размер 900 байт.

Обратите внимание, что он не обязательно должен быть первичным ключом (т.е. ограничение PRIMARY KEY в таблице). Любой уникальный индекс отдельного столбца, не допускающего значения NULL, будет работать. Если у вас нет такого столбца, добавьте в таблицу столбец идентификатора и добавьте в него индекс, а затем используйте этот индекс для полнотекстового каталога.

5
ответ дан 18 December 2019 в 13:13
поделиться
Другие вопросы по тегам:

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