Zend Lucene - поиск в текстовых файлах - PullRequest
2 голосов
/ 28 июня 2011

В настоящее время я работаю над личным проектом, в котором я читаю отсканированные документы с использованием tesseract и сохраняю содержимое в виде текстовых файлов.Я храню текстовые и jpeg-файлы в каталоге моей сети и поддерживаю связь между ними с помощью базы данных mySQL.Цель проекта - уметь искать ключевые термины и возвращать изображения.

До сих пор я мог индексировать текстовые файлы с помощью Zend Lucene, однако я испытал многоПроблемы при поиске документов, поля в моем индексе: дата загрузки изображения, тело (содержимое текстового файла) и URI для изображения.

//Create document
$doc = new Zend_Search_Lucene_Document();

//Select database and get item to be indexed
mysql_select_db("database", $con);

$exampleSQL = "SELECT date_format(dateUploaded, '%Y%m%d') as formatted_date, imageLink, textLink
FROM `mappingTable`
WHERE imageLink='$item'";

$fileItem = mysql_fetch_assoc(mysql_query($exampleSQL));

//Add fields to document
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('URL',
$fileItem['imageLink']));

$doc->addField(Zend_Search_Lucene_Field::Keyword('created',
$fileItem['formatted_date']));

$contents = file_get_contents("/path/to/data/".$fileItem['textLink']);

$doc->addField(Zend_Search_Lucene_Field::UnStored('body',
$contents));

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

if($queryType === "contentSearch"){

    $term  = new Zend_Search_Lucene_Index_Term($query, 'body');

    $searchQuery = new Zend_Search_Lucene_Search_Query_Term($term);

    try{
        $hits = $index->find($searchQuery);
    }
        catch (Zend_Search_Lucene_Exception $ex) {
        $hits = array();
    }

} elseif ($queryType === "dateSearch"){

    $searchQuery = '['.str_replace('/','',$fQuerydate)." TO ".str_replace('/','',$tQuerydate).']';

    try{
        $hits = $index->find($searchQuery);
    }
        catch (Zend_Search_Lucene_Exception $ex) {
        $hits = array();
    }

}  elseif ($queryType === "bothSearch"){

    $searchQuery = new Zend_Search_Lucene_Search_Query_MultiTerm();

    $searchQuery->addTerm(new Zend_Search_Lucene_Index_Term($query, 'body'), true);
    $searchQuery->addTerm(new Zend_Search_Lucene_Index_Term('['.str_replace('/','',$fQuerydate).' TO '.str_replace('/','',$tQuerydate).']', 'created'), true);

    // $searchQuery = 'body:"'.$query.'" && created:'.$fQuerydate." TO ".$tQuerydate;

try{
        $hits = $index->find($searchQuery);
    } catch (Zend_Search_Lucene_Exception $ex) {
        $hits = array();
    }
} else {
    $searchQuery = null;
}

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

например: + body: hill + создал: [20110328 TO 20110628]

Возвращает ноль документов.

Как видите, я избавился от всего '/','. 'и '-' в моем поле даты (создан), и я использовал для него объявление ключевого слова, чтобы обеспечить его соответствие поиску, но даже тогда ничего не возвращается.

Я также хотел бы знать, какпримените свой собственный стоп-лист для использования, поскольку есть некоторые термины, которые я хотел бы включить для поиска, которые в настоящее время не являются важными для документов.

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

Заранее спасибо.

1 Ответ

0 голосов
/ 29 июня 2011

Мне удалось найти способ эффективно выполнять поиск по обоим терминам. Это было очень просто, хотя и не скрыто. Код ниже.

if($queryType === "contentSearch"){

    $term  = new Zend_Search_Lucene_Index_Term($query, 'body');

    $searchQuery = new Zend_Search_Lucene_Search_Query_Term($term);

    try{
        $hits = $index->find($searchQuery);
    }
    catch (Zend_Search_Lucene_Exception $ex) {
        $hits = array();
    }

} elseif ($queryType === "dateSearch"){



    $from = new Zend_Search_Lucene_Index_Term(str_replace('/','',$fQuerydate), 'created');

    $to   = new Zend_Search_Lucene_Index_Term(str_replace('/','',$tQuerydate), 'created');

    $searchQuery = new Zend_Search_Lucene_Search_Query_Range(
                    $from, $to, true // inclusive
                    );

    try{
        $hits = $index->find($searchQuery);
    }
    catch (Zend_Search_Lucene_Exception $ex) {
        $hits = array();
    }

}  elseif ($queryType === "bothSearch"){

    $searchQuery = new Zend_Search_Lucene_Search_Query_Boolean();

    $term  = new Zend_Search_Lucene_Index_Term($query, 'body');

    $subquery1 = new Zend_Search_Lucene_Search_Query_Term($term);

    $from = new Zend_Search_Lucene_Index_Term(str_replace('/','',$fQuerydate), 'created');

    $to   = new Zend_Search_Lucene_Index_Term(str_replace('/','',$tQuerydate), 'created');

    $subquery2 = new Zend_Search_Lucene_Search_Query_Range(
                    $from, $to, true // inclusive
                    );

    $searchQuery->addSubquery($subquery1, true  /* required */);
    $searchQuery->addSubquery($subquery2, true  /* optional */);

    try{
        $hits = $index->find($searchQuery);
    }
        catch (Zend_Search_Lucene_Exception $ex) {
        $hits = array();
    }
}

Это приводит к следующему запросу: '+ (body: hill) + (созданный: [20110628 TO 20110629])', который работает.

Теперь мне нужна помощь в реализации моего собственного стоп-листа, то есть изменение стоп-листа, используемого lucene.

Приветствия

...