如何过滤过长的响应?

时间:2019-09-06 22:08:53

标签: elasticsearch

如果这是我的问题,我事先道歉在弹性搜索环境中是没有道理的,但是我已经到处搜索并且没有找到合适的解决方案/结论。

让我们假设我的索引只有一个description类型的属性text

让我们说我想搜索brown dog。我对以下结果感兴趣:

  • the brown dog
  • the dog is brown

但是我想舍弃较大值的结果,例如:

  • the brown dog and the lazy cat
  • the brown dog jumps over the fence

总而言之,我只对与我的搜索文字尽可能接近的结果感兴趣。

有没有一种方法或类型的查询可以让我完成此任务?

提前谢谢!如果我的问题不清楚,请随时告诉我。

3 个答案:

答案 0 :(得分:0)

嗯...由于您想要的完全无法做到,因此没有特定的处理方法。您可以做的最接近的事情就是处理查询,并做出很好的查询,以在搜索时获得高分。

https://www.compose.com/articles/elasticsearch-query-time-strategies-and-techniques-for-relevance-part-i/

阅读此书,希望对您有所了解。随时问我是否有麻烦!

答案 1 :(得分:0)

您的问题是关于删除搜索字段中包含不属于查询的“多”标记的匹配项。

您可能需要设置查询阈值(min-score),因为doc.length(aka fieldLen)是BM25和TF-IDF计算的一部分 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html#request-body-search-min-score

确定可以使用script-query来过滤doc.length。

答案 2 :(得分:0)

如果您希望完全匹配令牌(忽略停用词),可以尝试以下操作。 我正在使用停用词过滤器删除停用词(the,is等)和token_count数据类型以存储剩余令牌的计数。可以像以下文档一样查询文档:-“ search_text”:“棕色狗”,令牌长度为2。

映射:

PUT testindex6
{
  "settings": {
    "analysis": {
      "filter": {
        "english_stop": {
          "type": "stop",
          "stopwords": "_english_"
        }
      },
      "analyzer": {
        "stop_analyzer": {
          "tokenizer": "lowercase",
          "filter": [
            "english_stop"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "search_text": {
        "type": "text",
        "analyzer": "stop_analyzer",
        "fields": {
          "length": {
            "type": "token_count",
            "enable_position_increments":false,
            "analyzer": "stop_analyzer"
          }
        }
      }
    }
  }
}

数据:

 [
      {
        "_index" : "testindex6",
        "_type" : "_doc",
        "_id" : "QQ_ADm0BnGA1T2ysD5Hr",
        "_score" : 1.0,
        "_source" : {
          "search_text" : "the dog is brown"
        }
      },
      {
        "_index" : "testindex6",
        "_type" : "_doc",
        "_id" : "Qg_ADm0BnGA1T2ys4JH7",
        "_score" : 1.0,
        "_source" : {
          "search_text" : "the brown dog"
        }
      },
      {
        "_index" : "testindex6",
        "_type" : "_doc",
        "_id" : "Qw_BDm0BnGA1T2ysUJFH",
        "_score" : 1.0,
        "_source" : {
          "search_text" : "the brown dog and the lazy cat"
        }
      }
    ]

查询:

GET testindex6/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "search_text": "brown dog"
          }
        },
        {
          "term": {
            "search_text.length": {
              "value": 2
            }
          }
        }
      ]
    }
  }
}

结果:

[
      {
        "_index" : "testindex6",
        "_type" : "_doc",
        "_id" : "QQ_ADm0BnGA1T2ysD5Hr",
        "_score" : 1.2974876,
        "_source" : {
          "search_text" : "the dog is brown"
        }
      },
      {
        "_index" : "testindex6",
        "_type" : "_doc",
        "_id" : "Qg_ADm0BnGA1T2ys4JH7",
        "_score" : 1.2974876,
        "_source" : {
          "search_text" : "the brown dog"
        }
      }
    ]