Объяснение высокого уровня Класса Подобия для Lucene?

Транзакция A не завершится неудачей . Он не увидит данные, вставленные транзакцией B .

Демонстрация:

create table accounts (id bigserial primary key, balance bigint);
insert into accounts(balance) values (50), (100), (200);

Транзакция A :

begin transaction isolation level repeatable read;

select * from accounts where balance >= 100;
 id | balance 
----+---------
  2 |     100
  3 |     200
(2 rows)

Транзакция B :

begin;
insert into accounts(balance) values (300);
INSERT 0 1
commit;

Транзакция A :

select * from accounts where balance >= 100;
 id | balance 
----+---------
  2 |     100
  3 |     200
(2 rows)

Нет (4, 300) строки.

(протестировано на PostgreSQL 11.2)

Обратите внимание, что PostgreSQL имеет более строгие гарантии на REPEATABLE READ уровне изоляции. Это предотвращает фантомное чтение .

Из документации :

Уровень изоляции повторяемого чтения только видит данные, зафиксированные до начала транзакции; он никогда не видит ни незафиксированные данные, ни изменения, зафиксированные во время выполнения транзакций параллельными транзакциями (Тем не менее, запрос видит результаты предыдущих обновлений, выполненных в его собственной транзакции, даже если они еще не зафиксированы.) Это более надежная гарантия, чем требуется стандартом SQL для этого уровня изоляции [ 1132] blockquote>

Из таблицы 13.1. Уровни изоляции транзакции :

Фантомное чтение разрешено , разрешено на REPEATABLE READ уровне изоляции , но не в PG

См. Также :

Обновление

Если утверждение [ 1137]

update accounts set balance = balance + 30 where balance >= 100;

выдается как последний оператор транзакции A будут обновлены только 2 строки, потому что с точки зрения транзакции A есть только две строки, удовлетворяющие предикат balance >= 100:

update accounts set balance = balance + 30 where balance >= 100;
UPDATE 2

После фиксации:

commit;
COMMIT
select * from accounts;
 id | balance 
----+---------
  1 |      50
  4 |     300
  2 |     130
  3 |     230
(4 rows)

Обновляются только строки, возвращаемые этим оператором

select * from accounts where balance >= 100;

(исключая вставленную строку по транзакции B )

Обратите внимание, что транзакция A завершится с ошибкой , если попытается update изменить строку с помощью другой зафиксированной параллельной транзакции:

A

begin transaction isolation level repeatable read;
BEGIN
select * from accounts where id = 1;
 id | balance 
----+---------
  1 |      50
(1 row)

B

begin;
BEGIN
update accounts set balance = balance + 10;
UPDATE 3
commit;

A :

[ 1110]

Ошибка ожидается. Из документации:

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

ERROR: could not serialize access due to concurrent update потому что повторяемая транзакция чтения не может изменять или блокировать строки, измененные другими транзакциями после начала повторяемой транзакции чтения.

blockquote>

Ожидается, что приложения будут повторять неудачные транзакции:

Когда приложение получает это сообщение об ошибке, оно должно прервать текущую транзакцию и повторить всю транзакцию с самого начала. [ 1150] BLOCKQUOTE>

7
задан Matthew Simoneau 19 September 2013 в 14:59
поделиться

2 ответа

Встроенный Lucene Similarity довольно стандартная "Обратная Частота Документа" выигрыш алгоритма. Статья Wikipedia кратка, но касается основ. Книга Lucene в Действии ломает формулу Lucene более подробно; это не зеркально отражает текущую формулу Lucene отлично, но все основные понятия объяснены.

Прежде всего, счет меняется в зависимости от количества раз, что термин происходит в текущем документе (частотность термина), и обратно пропорционально с количеством раз термин происходит во всех документах (частота документа). Другие факторы в формуле вторичны, корректируя счет в попытке сделать очки из различных запросов довольно сопоставимыми друг с другом.

8
ответ дан 6 December 2019 в 21:20
поделиться

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

Скажите, что Ваш корпус нормализован для игнорирования некоторых условий, затем документ, состоящий только из тех условий, был бы расположен в источнике графика всех документов в векторном пространстве, определенном корпусом. Каждый документ, который содержит некоторые другие условия, затем представляет точку в пространстве, координаты которого определяются важностью того термина в документе относительно того термина в корпусе. Два документа (или документ и поиск), чьи координаты помещают свои "точки" ближе вместе, являются более похожими, чем те с координатами, которые помещают их "точки" далее независимо.

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

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