eshum

Рейтинг
17
Регистрация
12.01.2004
Должность
Programmer
Как писал InSAn
Хм... Спасибо за подсказку :)
А вот что делаю поисковики (или должны делать), когда встречается УРЛ с сессией?
Выкусывать сессию и запрашивать странцу без нее? Либо удалять страницу из индекса?
Вроде бы второе - более правильно, но тогда теряется много уникальных документов...

Похоже ничего не делают :) Весь вопрос как определить переменная сессии это или нет? Не исключено что на каком нибудь сайте переменная 'PHPSESSID' даже с 32 байтовым значением будет не сессией.

Как писал InSAn
А стоит ли позволять ему принимать куки?
Налицо - множество минусов. Например, сайт не за один проход считывается для последующей индексации.

При считывании страницы, нужно смотреть на пришедшую куку в которой записывается идентификатор сессии и искать этот идентификатор в URL'ях контента страницы, если идентификатор нашелся - можно смело делать выводы что это переменная сессии и выкусывать его с URL. Такой способ работает для любого количества считываемых за один проход страниц.

Если crawler будет принимать cookie и за один проход индекировать много страниц с одного сайта, то таких страниц с сессией в URL'е наверное будет не много. Я имею ввиду сессии PHP которые передаются в параметрах только один раз и затем хранятся в cookie браузера.

Может подойдет такой вариант - объединить таблицу "саму на себя" и отсортировать в порядке разницы позиций.

Для таблицы index(doc_id, word_id, weight, pos) запрос для двух слов ($word_id1, $word_id2) будет выглядеть так:

select i1.doc_id from index i1, index i2 where i1.doc_id=i2.doc_id and i1.word_id=$word_id1 and i2.word_id=$word_id2 and (i2.pos - i1.pos) > 0 order by (i2.pos - i1.pos)

Если предполагается ранжировать еще и в порядке веса слова в документе дописываем ...order by ((i2.pos - i1.pos) + N * ((i1.weight + i2.weight) / 2))

N - коэфициент "важности" веса слова

weight - чем меньше значение, тем вес выше

По идее можно написать такой запрос для 3-x и более слов. Под каждое количество слов свой запрос.

Как писал lagif
eshum,
Если разбирать морфологию, то найдете не только "функцию chmod" а и "функция chmod".

Верно, но можно перетранслировать запрос в форму ((функция || функцию) && chmod). Видимо и Яндекс хранит "не нормальную форму слова", т.к. позволяет искать точное соответствие без подключения морфолигии (такая возможность описана в синтаксисе запросов расширенного поиска).

Как писал lagif
eshum,
То есть вы хотите отказаться от нормальных форм слов?!! Какой смысл хранить его в текстовом виде?

А почему бы и нет? :)

Подумайте как работает морфология mail.ru поверх Гугла. А ведь Гугл ничего не знает о русской морфологии.

А смысл в таком хранении - отсутстивие возможности децентрализованно назначать словам идентификаторы.

Как писал lagif
Если рассматривать индекс как цельную структуру, то почему бы не построить его сегментированным по документам, а уж деревья слов (или сортированные списки), которые все равно строятся на указателях, будут накладываться на сегменты.
Первичным же ключом поиска так или иначе остаются идентификаторы слов. Так что здесь хэширование тоже не лишне.

На этапе поиска можно обойтись и без идентификаторов слов. Сегмент индекса можно сделать состоящим из двух файлов:

Файл смещений - файл для поиска начала и длины постлиста в индексе. Ключем для в этом файле будет слово в "в текстовом виде", и будет иметь переменную длину. Значением - абсолютное смещение начала постлиста в индексе и его длина. Для такого файла подойдет база BerkeleyDB, в ней есть поддержка ключей переменной длины.

Файл индекса - собствено инвертированный индекс, где хранятся списки документов соответствущих словам.

Проблема остается проблемой - дайте мне идеальную функцию хэширования :)

Похоже идеальной хеш функции в природе не существует :) Близкая к идеалу - CRC32, о чем уже писали. Кстати она используется в нескольких проектах с открытым исходным кодом.

Как писал lagif
Sparrow,

Сама организация индекса - в моем представлении - состоит из отсортированных по весу списков документов, относящихся к тому или иному слову (или, если хотите, словосочетанию - это уж как заблагорассудится разработчику).

Как правило, id документов в списке хранят в порядке возрастания их идентификаторов. Причин такого вида хранения несколько:

1) Возможность бысторого слияния (к примеру бинарным методом) нескольких таких отсортированых списков для многословных запросов.

2) Такие списки эфективно компрессируются. Алгоритмы компрессии (Elias gamma или delta, Variable byte и еще добрый десяток) целых положительных чисел (которымы являются идентификаторы документов) дают лучшую степень сжатия для малых чисел. А в отсортированных списках как раз есть возможность хранить не абсолютные идентификаторы а относительные, т.е хранить разницу от предыдущего значения, например список id документов: 910, 912, 915, 920, 921 хранится как: 910, 2, 3, 5, 1.

Есть aot.ru для Linux под LGPL лицензией.

Вот немного по теме - хранение лексикона в сжатом виде:

http://www-db.stanford.edu/cs347.2001.spring/handouts/lecture2-4in1.pdf

1 234
Всего: 37