gpt4 book ai didi

java - Elasticsearch 中的文档索引,JAVA API

转载 作者:行者123 更新时间:2023-12-02 22:40:55 25 4
gpt4 key购买 nike

我们正在使用 flex 搜索Java API为简历文档编制索引。它工作正常。当我们搜索关键字时,它会返回包含该关键字的精确响应(文档)。

但是我们想深入索引文件。例如,简历中包含“技能”及其“技能月”。技能月份可能是文档中的13个月。所以我搜索该技能,并在 flex 搜索查询中将技能月份设置在10到15个月之间,然后我们需要该记录(文档)。

我们应该怎么做?

这是索引的代码:

IndexResponse response = client
.prepareIndex(userName, document.getType(),
document.getId())
.setSource(extractDocument(document)).execute()
.actionGet();

public XContentBuilder extractDocument(Document document) throws IOException, NoSuchAlgorithmException {
// Extracting content with Tika
int indexedChars = 100000;
Metadata metadata = new Metadata();

String parsedContent;
try {
// Set the maximum length of strings returned by the parseToString method, -1 sets no limit
parsedContent = tika().parseToString(new BytesStreamInput(
Base64.decode(document.getContent().getBytes()), false), metadata, indexedChars);
} catch (Throwable e) {
logger.debug("Failed to extract [" + indexedChars + "] characters of text for [" + document.getName() + "]", e);
System.out.println("Failed to extract [" + indexedChars + "] characters of text for [" + document.getName() + "]" +e);
parsedContent = "";
}

XContentBuilder source = jsonBuilder().startObject();

if (logger.isTraceEnabled()) {
source.prettyPrint();
}

// File
source
.startObject(FsRiverUtil.Doc.FILE)
.field(FsRiverUtil.Doc.File.FILENAME, document.getName())
.field(FsRiverUtil.Doc.File.LAST_MODIFIED, new Date())
.field(FsRiverUtil.Doc.File.INDEXING_DATE, new Date())
.field(FsRiverUtil.Doc.File.CONTENT_TYPE, document.getContentType() != null ? document.getContentType() : metadata.get(Metadata.CONTENT_TYPE))
.field(FsRiverUtil.Doc.File.URL, "file://" + (new File(".", document.getName())).toString());

if (metadata.get(Metadata.CONTENT_LENGTH) != null) {
// We try to get CONTENT_LENGTH from Tika first
source.field(FsRiverUtil.Doc.File.FILESIZE, metadata.get(Metadata.CONTENT_LENGTH));
} else {
// Otherwise, we use our byte[] length
source.field(FsRiverUtil.Doc.File.FILESIZE, Base64.decode(document.getContent().getBytes()).length);
}
source.endObject(); // File

// Path
source
.startObject(FsRiverUtil.Doc.PATH)
.field(FsRiverUtil.Doc.Path.ENCODED, SignTool.sign("."))
.field(FsRiverUtil.Doc.Path.ROOT, ".")
.field(FsRiverUtil.Doc.Path.VIRTUAL, ".")
.field(FsRiverUtil.Doc.Path.REAL, (new File(".", document.getName())).toString())
.endObject(); // Path

// Meta
source
.startObject(FsRiverUtil.Doc.META)
.field(FsRiverUtil.Doc.Meta.AUTHOR, metadata.get(Metadata.AUTHOR))
.field(FsRiverUtil.Doc.Meta.TITLE, metadata.get(Metadata.TITLE) != null ? metadata.get(Metadata.TITLE) : document.getName())
.field(FsRiverUtil.Doc.Meta.DATE, metadata.get(Metadata.DATE))
.array(FsRiverUtil.Doc.Meta.KEYWORDS, Strings.commaDelimitedListToStringArray(metadata.get(Metadata.KEYWORDS)))
.endObject(); // Meta


// Doc content
source.field(FsRiverUtil.Doc.CONTENT, parsedContent);

// Doc as binary attachment
source.field(FsRiverUtil.Doc.ATTACHMENT, document.getContent());

// End of our document
source.endObject();

return source;
}

下面的代码用于获取响应:
QueryBuilder qb;
if (query == null || query.trim().length() <= 0) {
qb = QueryBuilders.matchAllQuery();
} else {
qb = QueryBuilders.queryString(query);//query is a name or string
}
org.elasticsearch.action.search.SearchResponse searchHits = node.client()
.prepareSearch()
.setIndices("ankur")
.setQuery(qb)
.setFrom(0).setSize(1000)
.addHighlightedField("file.filename")
.addHighlightedField("content")
.addHighlightedField("meta.title")
.setHighlighterPreTags("<span class='badge badge-info'>")
.setHighlighterPostTags("</span>")
.addFields("*", "_source")
.execute().actionGet();

最佳答案

flex 搜索默认为所有列编制索引,以提供更好的搜索功能。在将JSON文档置于某种类型之前,最好定义映射(请参阅https://www.elastic.co/guide/en/elasticsearch/guide/current/mapping-analysis.html)

当您想通过精确关键字搜索数据时,可能需要通过不分析来跳过特定的列。索引文档时,将分析列值,然后对其进行索引。您可以强制Elastic说“not_analyzed”。然后,您的列值将被原样索引。这样,您可以获得更好的搜索结果。

对于定义JSON文档的另一部分,最好使用一些库来定义JSON。我更喜欢Jackson库来解析JSON文档。这将减少项目中的代码行。

关于java - Elasticsearch 中的文档索引,JAVA API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30932619/

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