В настоящее время я работаю над личным проектом, в котором я читаю отсканированные документы с использованием 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, лучше ли мне использовать полнотекстовый поиск в моей БД?
Заранее спасибо.