4

Lucene を使用して ElasticSearch インデックスを照会できますか?

ElasticSearch を使用してインデックスを作成し、次の 3 つのドキュメントを挿入しました。

$ 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"}'

したがって、1 つのインデックス、2 つのタイプ、および 3 つのドキュメントがあります。ここで、標準の Lucene を使用してこれらを検索したいと思います。16 進数エディターを使用して、どのシャードにインデックス付きドキュメントがあるかを特定し、そのインデックスを正常にクエリできます。ただし、一致するドキュメントからフィールド値を取得する方法がわかりません。

次のプログラムは検索に成功しましたが、結果を取得できませんでした。

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

上記の _uid 値は正しいです。

Eclipse は、変数 Document d に 2 つのフィールドがあることを示しています。

  • 保存、インデックス化、トークン化、omitNorms<_uid:type2#3K5QXeZhQnit9UXM9_4bng>
  • 保存<_source:[7b 22 66 32 22 3a 22 63 61 74 22 7d]>

残念ながら、d.get("_source") も null を返します。

一致するクエリのドキュメント フィールドを取得するにはどうすればよいですか?

ありがとうございました。

4

1 に答える 1