Не удается найти результаты из действительного индекса с помощью PhraseQuery или WildcardQuery? - PullRequest
0 голосов
/ 10 мая 2011

По какой-то причине я не могу найти никаких результатов из моего действительного индекса из 3552 элементов.

Пожалуйста, ознакомьтесь с приведенным ниже кодом, а затем с консольным выводом программы при запуске. 3552 - количество проиндексированных документов. / c: /test/stuff.txt - это правильный индексированный путь, который извлекается из документа 5 в качестве теста.И весь текст внизу - это полный текст (в выводе типа XML) тестового файла.Что мне не хватает, что мой простой запрос не дает результатов?

Может быть, мой синтаксис WildcardQuery плох?Я думал, что это будет неэффективно (из-за подстановочных знаков в начале и в конце), но он по крайней мере вернет этот документ из индекса ...

import java.io.File;
import java.io.IOException;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Fieldable;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.store.FSDirectory;


public class Searcher
{

    /**
    * @param args
    * @throws IOException 
    * @throws CorruptIndexException 
    */
    public static void main(String[] args) throws CorruptIndexException, IOException
    {

        System.out.println("Begin searching test...");

        IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File(args[0])));

        // termContainsWildcard is shown to be true here when debugging
        // numberOfTerms is 0
        WildcardQuery query = new WildcardQuery(new Term("contents", "*stuff*"));

        System.out.println("Query field is: " + query.getTerm().field());
        System.out.println("Query field contents is: " + query.getTerm().text());

        TopDocs results = searcher.search(query, 5000);

        // no results returned :(
        System.out.println("Total results from index " + args[0] + ": " + results.totalHits);

        for (ScoreDoc sd : results.scoreDocs)
        {
            System.out.println("Document matched. Number: " + sd.doc);
        }

        System.out.println();

        System.out.println("Begin reading test...");

        // now read from the index to see if I am crazy
        IndexReader reader = IndexReader.open(FSDirectory.open(new File(args[0])));

        // correctly shows the number of documents in the local index
        System.out.println("Number of indexed documents: " + reader.numDocs());

        // pick out a random, small document and check its fields
        Document d = reader.document(5);

        for (Fieldable f : d.getFields())
        {
            System.out.println("Field name is: " + f.name());
            System.out.println(new String(f.getBinaryValue()));
        }
    }
}  

ВЫВОД КОНСОЛИ ПРИ РАБОТЕ1013 *

Начать тест поиска ...
Поле запроса: содержание
Содержание поля запроса: *stuff*
Всего результатов индекса C: \ INDEX2: 0

Начать тест чтения ...
Количество проиндексированных документов: 3552
Имя поля: путь
/c:/test/stuff.txt
Имя поля: содержание
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="Content-Length" content="8"/>
<meta name="Content-Encoding" content="UTF-8"/>
<meta name="Content-Type" content="text/plain"/>
<meta name="resourceName" content="stuff.txt"/>
<title/>
</head>
<body>
<p>stuff &#13;
</p>
</body>
</html>

Ответы [ 2 ]

1 голос
/ 15 мая 2011

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

0 голосов
/ 12 мая 2011

По умолчанию префиксные запросы с подстановочными знаками (запросы с подстановочными знаками с символом *) отключены в Lucene.См. Lucene FAQ для получения дополнительной информации.Если вы хотите включить префиксные запросы с подстановочными знаками, попробуйте:

QueryParser.setAllowLeadingWildcard(true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...