Номер результата для булевых запросов с Apache Lucene - PullRequest
0 голосов
/ 22 ноября 2018

При тестировании Apache Lucene v7.5 я заметил странное поведение: я проиндексировал дамп английской Википедии (5 677 776 документов), используя Lucene, с SimpleAnalyzer (без стоп-слов, без прохождения)

Затем я искал индекс сследующие запросы:

  • the totalHits = 5 382 873
  • who totalHits = 1 687 254
  • кто totalHits = 5,411,305
  • "кто" totalHits = 8,827

Номер результата для логического запроса кто больше, чем номер результата для одного члена и номер результата для одного члена who , когда он должен быть меньше обоих.

Есть ли объяснение этому?

Фрагмент кода:

analyzer = new SimpleAnalyzer();
MultiFieldQueryParser parser = new MultiFieldQueryParser(new String[]{"title", "content","domain","url"},analyzer);

// Parse
Query q = parser.parse(querystr);

// top-10 results
int hitsPerPage = 10;

IndexReader indexReader = DirectoryReader.open(index);
IndexSearcher searcher = new IndexSearcher(indexReader);

// Ranker
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage);

// Search
searcher.search(q, collector);

// Retrieve the top-10 documents
TopDocs topDocs=collector.topDocs();

ScoreDoc[] hits = topDocs.scoreDocs;
totalHits=topDocs.totalHits;


System.out.println("query: "+querystr + " " + hits.length+" "+String.format("%,d",totalHits));

1 Ответ

0 голосов
/ 26 ноября 2018

Объяснение состоит в том, что оператор по умолчанию - OR, а не AND, как вы предполагаете.Поиск the who возвращает документы, которые имеют the или who или оба.

the - 5,382,873
who - 1,687,254
the OR who - 5,411,305

Т.е. большинство документов, которые содержат who, также содержат the, за исключением 28 432 документов, которыедобавляется в набор результатов при получении обоих.

Вы можете изменить это поведение, изменив оператор по умолчанию:

parser.setDefaultOperator(QueryParserBase.AND_OPERATOR)
...