gpt4 book ai didi

elasticsearch - 带频率计数的前缀搜索

转载 作者:行者123 更新时间:2023-11-29 02:52:35 25 4
gpt4 key购买 nike

在索引文本时,我将每个单词的频率计数存储在数据库中。这很好用,因为所有搜索都是基于整个单词并且所有可能的搜索都是已知的。但是现在我想添加前缀搜索选项(搜索单词的一部分)。我可以使用以下方法从使用 elasticsearch 的前缀搜索中获取结果/命中:

GET /my_index/address/_search
{
"query": {
"prefix": {
"main_text": "word_part"
}
}
}

参见:https://www.elastic.co/guide/en/elasticsearch/guide/current/prefix-query.html

这是我当前的映射:

{
"my-index":{
"mappings":{
"doc":{
"properties":{
"keycounter":{
"properties":{
"counter": {"type":"integer"},
"keyword":{"type":"keyword"}
}
},
"main_text":{
"type":"text",
"fielddata":true
},
"main_text_keycounter":{
"properties":{
"counter":{
"type":"long"
},
"keyword":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
},
"time_written":{
"type":"date"
},
"translated_text":{
"type":"text",
"fielddata":true
},
}
}
}
}
}

但我不想计算我得到的每个结果的频率,因为每个文本的成本为 O(N)。是否有一些聪明的方法可以使用 elasticsearch 从这种类型的搜索中存储/获取频率计数?

最佳答案

您可以使用 doc-termvectors elasticsearch 的功能,用于获取术语统计信息和术语计数。这样,您可以使用映射存储文档,并在查询时获取前缀术语的统计信息。当然,这种方法为您提供了每个结果文档的术语统计信息,因此您必须为所有结果汇总它。

这是映射、索引文档和 doc-termvectors 查询的示例。您还可以使用 edge-ngram分词器以获取前缀词的统计信息。

映射:

PUT /my-index
{
"mappings": {
"doc": {
"properties": {
"main_text": {
"type": "text",
"fielddata": true,
"term_vector": "with_positions_offsets_payloads",
"store": true
}
}
}
}
}

索引文档:

POST /my-index/doc/1
{
"main_text": "foo bar foo"
}

获取术语向量:

POST /my-index/doc/1/_termvectors

结果:

...
"terms": {
...
"foo": {
"term_freq": 2,
"tokens": [
{
"position": 0,
"start_offset": 0,
"end_offset": 3
},
{
"position": 2,
"start_offset": 8,
"end_offset": 11
}
]
}
...

编辑

如果你想获得多个文档的termvectors,你可以使用_mtermvectors端点。它将为您提供多个文档的统计信息。但是,它不会计算所有文档的术语频率,这是我理解你的问题你想要的。作为一种解决方案,您可以将 termvectors 的结果存储在您的弹性(相同索引或单独索引)中,然后使用聚合来计算总术语数。

POST /my-index/doc/_mtermvectors
{
"ids": [
"1",
"2"
],
"parameters": {
"fields": [
"main_text"
],
"term_statistics": true
}
}

编辑

然后我认为解决方案是为所有文档调用 termvectors 并存储结果,即另一个索引中的所有术语和子术语频率。通过根据您的搜索查询汇总结果,您会得到您想要的结果。

关于elasticsearch - 带频率计数的前缀搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53092276/

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