2009-09-02 2 views
1

У меня есть большой документ с различными разделами. В каждом разделе есть список интересующих ключевых слов/фраз. У меня есть главный список ключевых слов/фраз, хранящихся в массиве String. Как я могу использовать Solr или Lucene для поиска каждого документа раздела для всех ключевых слов и в основном дать мне, какие ключевые слова были найдены? Я не могу думать о какой-либо простой способ реализации этого ....Искал список ключевых слов, чтобы узнать, какие из них существуют

Thanks

+0

Вы пытаетесь создать индекс задней части книги? Это одноразовый запуск, или вы будете искать индекс с течением времени? Пожалуйста, дайте краткий пример того, что вы имеете в виду (скажем, два раздела, по два ключевых слова для каждого и требуемый ввод и вывод). –

ответ

1

Начните с basics

ли запущенная программа, вы узнаете, как Lucene индексы, это должно помочь индексу и поиск документов, содержащих поля

принять решение по поводу ваших данных, как это должно быть stored,. т.е. .; DateFields должны быть сохранены как Field.Index.NOT_ANALYZED вместо Field.Index.ANALYZED

Теперь следующий шаг должен быть

//indexmap ==> HashMap 
//keywordfields ==> you master list of keywords/phrases 
//selectfields ==> your document field (contained in lucene index) 
String[] keywordfields = (String[]) indexmap.get("keywordfields").toString().split(","); 
String[] selectFields = (String[]) indexmap.get("indexfields").toString().split(","); 
//create a booleanquery 
BooleanQuery bq = new BooleanQuery(); 
//iterate the keywordfields 
for (int i = 0; i < keywordfields.length; i++) { 
    bq.add(new BooleanClause(new TermQuery(new Term(keywordfields[i], (String)params.get(SEARCH_QUERYSTRING))),BooleanClause.Occur.SHOULD)); 
       } 
//pass the boolean query object to the indexsearcher 
topDocs = indexSearcher.search(rq, 1000); 
//get a reference to ScoreDoc 
ScoreDoc[] hits = topDocs.scoreDocs; 
//Iterate the hits 

    Map <String, Object> resultMap = new HashMap<String, Object>(); 
    List<Map<String, String>> resultList = new ArrayList<Map<String, String>>(); 
        for (ScoreDoc scoreDoc : hits) { 
        int docid = scoreDoc.doc; 
        FieldSelector fieldselector = new MapFieldSelector(selectFields); 
        Document doc = indexSearcher.doc(docid, fieldselector); 

        Map<String, String> searchMap = new HashMap<String, String>(); 
        // get all fields for documents we got 
        List<Field> fields = doc.getFields(); 
        for (Field field : fields) { 
         searchMap.put(field.name(), field.stringValue()); 
         System.out.println("Field Name:" + field.name()); 
         System.out.println("Field value:" + field.stringValue()); 
        } 
        resultList.add(searchMap); 
        resultMap.put(TOTAL_RESULTS, hits.length); 
        resultMap.put(RS, resultList); 
       }    
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

Это должно быть одним из реализации с помощью Lucene =]

+0

Спасибо. Мы решили сосредоточиться вокруг Солра. Может ли кто-то любезно предоставить пример Solr того же - возможно, используя Solrj? Мои ключевые слова могут быть либо 1 ключом (например, Solr), либо 2 ключами (например, Apache Lucene) до 5 ключей ... например (Apache Lucene Web Service Deploy) – 2009-09-06 19:21:06

0

Похоже, все, что вы знаете, это функциональность анализа Lucene. В основе этой функциональности лежит класс Analyzer. Из документации:

Анализатор создает TokenStreams, которые анализируют текст. Таким образом, он представляет собой политику для извлечения индексных терминов из текста.

Есть много Analyzer классов на выбор, но StandardAnalyzer обычно делает хорошую работу:

// For each chapter... 

Reader reader = ...; // You are responsible for opening a reader for each chapter 
Analyzer analyzer = new StandardAnalyzer(); 
TokenStream tokenStream = analyzer.tokenStream("", reader); 

Token token = new Token(); 
while ((token = tokenStream.next(token)) != null)) { 
    String keyword = token.term(); 
    // You can now do whatever you wish with this keyword 
} 

Вы можете обнаружить, что другие анализаторы будут делать лучше для ваших целей.

Смежные вопросы