gpt4 book ai didi

lucene - 如何使用Lucene查询ElasticSearch索引

转载 作者:行者123 更新时间:2023-11-29 02:57:20 27 4
gpt4 key购买 nike

我可以使用 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

上面的 _uid 值是正确的。

Eclipse 显示变量 Document d 确实有两个字段:

  • 存储、索引、标记化、omitNorms<_uid:type2#3K5QXeZhQnit9UXM9_4bng>
  • 存储<_source:[7b 22 66 32 22 3a 22 63 61 74 22 7d]><​​/li>

不幸的是,d.get("_source") 也返回 null。

如何检索匹配查询的文档字段?

谢谢。

最佳答案

如评论中所述,我需要将字段“_source”检索为二进制值。所以这有效:d.getBinaryValue("_source") 并检索到 [7b 22 66 32 22 3a 22 63 61 74 22 7d],即 {"f2":"cat"}。 Javanna,感谢您的帮助。

关于lucene - 如何使用Lucene查询ElasticSearch索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16825453/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com