如果字符串在数组中包含90%的单词,则返回

时间:2020-01-10 11:35:10

标签: elasticsearch

我对Elasticsearch没问题,但是对我来说解决这个问题有点先进。如果我有一个单词数组,该如何搜索包含字符串字段(其中包含90%的单词)的文档?

例如

iKnowTheseWords = ["word1","word2","word3","word4","word5","word6","word7","word8","word9"]

documents = [
  {
    "id": "1",
    "content": "word1 word2 word3 word4 word5 word6 word7 word8 word9 word10"
  },
  {
    "id": "2",
    "content": "word1 word2 word3 word4"
  },
  {
    "id": "3",
    "content": "word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 word11 word12 word13 word14"
  }
]

在上面的示例中,我希望返回ID为1和2的文档,但不返回ID 3,因为它包含的单词比我所知道的更多,并且超过了90%的阈值(文档1很好,因为我知道其中90%个字)。

很显然,有一些方法可以通过编程方式解决此问题,但是我希望能够在Elasticsearch查询级别上做到这一点。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我从没做过,但是我将从查看should in bool queriesconstant score开始,以便您可以根据点击量来量化得分

答案 1 :(得分:0)

在使用函数式编程的普通JavaScript中,您可以执行以下操作:

var threshold = 0.9; // 90%
var found = documents
   .filter(document => {
      var numberOfWordsFound = iKnowTheseWords
         .reduce((total, word) => {
            var hasWord = document.content.split(word).length > 1;
            return hasWord ? (total + 1) : total;
         }, 0);
      var precentage = numberOfWordsFound / iKnowTheseWords.length;
      return precentage > threshold;
   });

found变量将包含所有满足阈值的文档。