【问题标题】:Elasticsearch: Sort the Documents on the index value of the search string in a text fieldElasticsearch:根据文本字段中搜索字符串的索引值对文档进行排序
【发布时间】:2020-09-20 04:32:53
【问题描述】:

我有这样的 Elasticsearch 数据-

PUT /text/_doc/1
{
  "name": "pdf1",
  "text":"For the past six weeks. The unemployment crisis has unfolded so suddenly and rapidly."
}
PUT /text/_doc/2
{
  "name": "pdf2",
  "text":"The unemployment crisis has unfolded so suddenly and rapidly."
}

在此示例中,我正在进行全文搜索,我正在搜索“文本”字段中具有“失业”子字符串的所有文档。最后,我希望所有文档按“文本”字段中“失业”字符串的索引值的升序排序。例如 - 子字符串“unemployment”首先出现在 doc2 中的索引“4”处,所以我希望该文档首先在结果中返回。

GET /text/_search?pretty
{
  "query": {
    "match": {
      "text": "unemployment"
    }
  }
}

我尝试了一些类似 term_vector 的东西,这是我使用的映射,但没有帮助。

PUT text/_mapping
{
    "properties": {
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword"
            }
          }
        },
        "text" : {
          "type" : "text",
          "term_vector": "with_positions_offsets"
        }
      }
}

谁能帮我制作正确的映射和搜索查询?

提前致谢!

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation elasticsearch-query


    【解决方案1】:

    试试这个查询

    GET text/_search
    {
      "query": {
        "function_score": {
          "query": {
            "match": {
              "text": "unemployment"
            }
          },
          "functions": [
            {
              "script_score": {
                "script": {
                  "source": """
                    def docval = doc['text.keyword'].value;
                    def length = docval.length();
                    def index = (float) docval.indexOf('unemployment');
    
                    // the sooner the word appears the better so 'invert' the 'index'
                    return index > -1 ? (1 / index) : 0;
                  """
                }
              }
            }
          ],
          "boost_mode": "sum"
        }
      }
    }
    

    使用自动生成的映射

    {
      "text" : {
        "mappings" : {
          "properties" : {
            "name" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "text" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        }
      }
    }
    

    请注意,这是区分大小写的,因此有一个小写规范化的关键字字段也是合理的,然后在脚本得分脚本中访问它。 This 可能会让你走上正确的道路。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-06
      • 2014-01-09
      • 2015-05-23
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多