2016-03-15 2 views
0

Я попытался найти наилучший подходящий продукт (бумажное полотенце) от определенного продавца, мой запрос следующий, но запрос возвращает 0 ударов.Lucene Search 2 поля

BooleanQuery.Builder combine = new BooleanQuery.Builder(); 

Query q1 = new QueryParser("product", new StandardAnalyzer()).parse(QueryParser.escape("product:" + "bounty paper towel")); 
combine.add(q1, BooleanClause.Occur.SHOULD); // find best name match 

Query q2 = new QueryParser("retailer", new StandardAnalyzer()).parse(QueryParser.escape("retailer:" + "Target")); 
combine.add(q2, BooleanClause.Occur.MUST); // Must from this retailer 

searcher.search(combine.build(), hitsPerPage).scoreDocs; 

Есть ли что-то не так с тем, как я строю запрос?

ответ

1

Вы избегаете тех вещей, которые вы не хотите убегать. Вы передаете строку «product: bounty paper towel» в метод escape, который выйдет из двоеточия, которого вы не хотите убегать. В сущности, этот запрос, после побега и анализа, будет выглядеть следующим образом:

продукт: продукт \: Баунти продукт: бумажные изделия: полотенца

Вы должны бежать условие поиска, а не все запрос. Что-то вроде:

parser.parse("product:" + QueryParse.escape("bounty paper towels")); 

Кроме того, похоже, что вы ищете фразу запрос там, в этом случае, он должен быть заключены в кавычках:

parser.parse("product:\"" + QueryParse.escape("bounty paper towels") + "\""); 

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

parser.parse(
    "product:\"" + QueryParse.escape("bounty paper towels") + "\"" 
    + "+retailer:" + QueryParse.escape("Target") 
); 

Но опять же, нет ничего плохого в BooleanQuery.Builder вместо этого.

1

Б Lucene слишком много лет назад, но позвольте мне попробовать ...

Rewrite вы parse часть следующим образом:

... 
Query q1 = new QueryParser("product", new StandardAnalyzer()) 
      .parse("bounty paper towel"); 
... 
Query q2 = new QueryParser("retailer", new StandardAnalyzer()) 
      .parse("Target")); 
... 

Таким образом, ваш запрос должен содержать только информацию о цели, а не имя столбца - поскольку он уже упоминался ранее.