2013-05-29 4 views
2

Могу ли я использовать Lucene для запроса индекса ElasticSearch?Как использовать Lucene для запроса индекса ElasticSearch

Использование ElasticSearch Я создал индекс и вставил эти три документа:

$ curl -XPOST localhost:9200/index1/type1 -d '{"f1":"dog"}' 
$ curl -XPOST localhost:9200/index1/type2 -d '{"f2":"cat"}' 
$ curl -XPOST localhost:9200/index1/type2 -d '{"f3":"horse"}' 

Итак, у меня есть один индекс, два типа, а также три документа. Теперь я хотел бы искать их, используя стандартную Lucene. Используя шестнадцатеричный редактор, я определил, какой осколок имеет индексированные документы, и я могу успешно запросить этот индекс. Однако я не могу понять, как получить значения полей из соответствующего документа (ов).

Следующая программа успешно выполняет поиск, но не может получить результаты.

import org.apache.lucene.analysis.standard.StandardAnalyzer; 
import org.apache.lucene.document.Document; 
import org.apache.lucene.index.DirectoryReader; 
import org.apache.lucene.index.IndexReader; 
import org.apache.lucene.queryparser.classic.QueryParser; 
import org.apache.lucene.search.IndexSearcher; 
import org.apache.lucene.search.Query; 
import org.apache.lucene.search.ScoreDoc; 
import org.apache.lucene.search.TopScoreDocCollector; 
import org.apache.lucene.store.Directory; 
import org.apache.lucene.store.FSDirectory; 
import org.apache.lucene.util.Version; 

import java.io.File; 

public class TestES { 

void doWork(String[] args) throws Exception { 
    // Index reader for already created ElasticSearch index 
    String indx1 = "/path-to-index/elasticsearch-0.90.0.RC2-SNAPSHOT/data/elasticsearch/nodes/0/indices/index1/1/index"; 
    Directory index = FSDirectory.open(new File(indx1)); 
    IndexReader reader = DirectoryReader.open(index); 
    IndexSearcher searcher = new IndexSearcher(reader); 

    // Looks like the query is correct since we do get a hit 
    StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_41); 
    Query q = new QueryParser(Version.LUCENE_41, "f2", analyzer).parse("cat"); 
    TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); 
    searcher.search(q, collector); 
    ScoreDoc[] hits = collector.topDocs().scoreDocs; 

    // We do get a hit, but results always displayed as null except for "_uid" 
    if (hits.length > 0) { 
     int docId = hits[0].doc; 
     Document d = searcher.doc(docId); 
     System.out.println("DocID " + docId + ", _uid: " + d.get("_uid")); 
     System.out.println("DocID " + docId + ", f2: " + d.get("f2")); 
    } 
    reader.close(); 
} 

public static void main(String[] args) throws Exception { 
    TestES hl = new TestES(); 
    hl.doWork(args); 
} 
} 

Results: 
DocID 0, _uid: type2#3K5QXeZhQnit9UXM9_4bng 
DocID 0, f2: null 

Значение, указанное выше, правильное.

Eclipse, показывает мне, что переменная документа d имеет два поля:

  • хранится, индексированные метками, omitNorms < _uid: TYPE2 # 3K5QXeZhQnit9UXM9_4bng>
  • хранится < _source: [7b 22 66 32 22 3a 22 63 61 74 22 7d]>

К сожалению, d.get ("_ source") также возвращает null.

Как получить поля документа для соответствующего запроса?

спасибо.

+0

Ну, во-первых, я хотел бы спросить вас, почему вы делаете так, как это должно быть :) В любом случае, вы делаете это правильно, поле '_source' хранится по умолчанию и содержит весь отправленный вами документ для поиска elastics. Вы должны получить его и проанализировать в виде json-документа. Не знаю, почему вы получаете нуль. Вы убедились, что используете правильную версию lucene? – javanna

+0

Я боялся, что кто-то задаст этот вопрос :) Да, я проверял, что я запускаю elasticsearch-0.90.0.RC2-SNAPSHOT/bin и банки Lucene находятся в elasticsearch-0.90.0.RC2-SNAPSHOT/lib. Я все еще не могу получить «_source» – user2434291

+1

А, я понял. Интересно, что мне нужно было получить поле «_source» как двоичное значение. Итак, это сработало: d.getBinaryValue («_ source»), и он получил [7b 22 66 32 22 3a 22 63 61 74 22 7d], который является {"f2": "cat"} – user2434291

ответ

0

Как указано в комментарии, мне нужно было получить поле «_source» как двоичное значение. Таким образом, это сработало: d.getBinaryValue («_ source»), и он получил [7b 22 66 32 22 3a 22 63 61 74 22 7d], который является {"f2": "cat"}. Джаванна, спасибо за помощь.

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