我想使用elasticsearch进行自动填充。
我试过了
假设我有以下数据:
json_decode()
每当我查询PHP Programing
php prado framework
OOP PHP Programming
PHPMyAdmin
PHP
Php
时,结果都会如上所示^
如何让PHP首先显示?而不是最后一个
为什么PHP编程的权重比PHP高,这等于查询?
注意:我已经添加了小写过滤器,因此将查询视为区分大小写,这就是为什么PHP
都与查询匹配
答案 0 :(得分:0)
我不确切知道你在做什么,所以提供更多信息会有所帮助。
但我得到以下工作,而不是一个建议示例,但它显示了如何使用分数来排序
@Test
public void es() throws Exception {
insert("value", "foo foo");
insert("value", "foo");
insert("value", "fooa");
insert("value", "fao");
insert("value", "foo potato foo bar");
insert("value", "foo potato bar");
insert("value", "foo potato");
insert("value", "foo vegetable");
insert("value", "foo vegetable");
Thread.sleep(1000);
SearchResponse searchResponse =
getClient().prepareSearch()
.setQuery(QueryBuilders.matchPhraseQuery("value", "foo"))
.addSort(SortBuilders.scoreSort()
.order(SortOrder.DESC))
.execute().actionGet();
Arrays.stream(searchResponse.getHits().getHits())
.forEach(h -> System.out.println(h.getSource().get("value") + ": " + h.getScore()));
}
<强>输出:强>
foo: 1.1177831
foo foo: 0.98798996
foo potato foo bar: 0.790392
foo potato: 0.6986144
foo vegetable: 0.6986144
foo vegetable: 0.6986144
foo potato bar: 0.55889153
答案 1 :(得分:0)
要实现所需的行为,您需要在使用edgengram分析器的字段上使用edgengrams(https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenizer.html)。要在任何其他前缀匹配的基础上对完全匹配进行排名,请维护一个未分析的附加字段,并在should子句中使用它以增加其相关性(https://www.elastic.co/guide/en/elasticsearch/guide/current/query-scoring.html)