在旧的VARCHAR列上使用DB2 Text Search和排名结果

时间:2017-12-08 17:48:05

标签: db2 db2-luw

(编辑) Linux上的DB2 10.5.0

希望有人可能有一些见解。我或多或少被迫使用DB2,因此无法使用弹性搜索等方法。

假设我有一个包含单列COMPANY_NAME VARCHAR(240)的简单表。运行db2ts并在其上运行文本搜索索引。

我有这样的公司名称:

MY GENERAL COMPANY
MY COMPANY
MY SUPER AWESOME COMPANY
MY COMPANY NAMED DUDE
MYLO COMPANIO

我执行查询:

SELECT COMPANY_NAME FROM COMPANY_TABLE WHERE CONTAINS('MY COMPANY~0.6') = 1

我可以使用SCORE对结果进行排序,但所有SCORE都会计算单词在文本中出现的次数。因此,在这种情况下,SCORE会将该姓氏排在底部,但所有其他名称都相同。没用。

我真正想要的是一个"亲和力排名"根据CONTAINS如何决定选择结果集。直觉上,我希望人类接受这个排名列表作为答案:

COMPANY_NAME
---------------------------
MY COMPANY
MY COMPANY NAMED DUDE
MY GENERAL COMPANY
MY SUPER AWESOME COMPANY
MYLO COMPANIO

我从上面的CONTAINS得到了结果集,这很好。我无法弄清楚如何将结果集设置为ORDER BY"亲和力来搜索术语"

1 个答案:

答案 0 :(得分:0)

只是一个猜测...认为你想使用package com.company; import java.util.Arrays; import java.util.Map; import java.util.TreeMap; public class Main { public static void main(String[] args) throws InterruptedException { // your given string String x = "dasamdw"; // map to store each letter:numberOfRepetition pairs (I used TreeMap just to print letters alphabetically) Map<String, Integer> letters = new TreeMap<>(); // stream of char[] from the given string, add letter to the map if it doesnt exist with value 1 // if it already exists, just increase value by 1 Arrays.stream(x.split("")).forEach(y -> letters.put(y, letters.get(y) == null ? 1 : letters.get(y) + 1)); // loop over map and print out the results of lambda above for (Map.Entry s : letters.entrySet()) { System.out.print(s.getKey() + "" + s.getValue()); } } } ...它不应该返回1,它应该返回0到1之间的值。

SCORE()