我有一些PageDocument
我希望根据标题进行搜索,不包括PageDocument
s,其路径以某些特定文字开头。分析该字段。我想要一些模糊来帮助用户解决拼写错误。我需要能够进行部分匹配,因此some
会匹配some text
和this is some text
。
如果我使用以下查询,由于tf-idf
,我没有得到完全匹配作为第一个结果{
"size": 20,
"query": {
"bool": {
"must": [
{
"match": {
"title": {
"query": "myterm",
"fuzziness": 1
}
}
}
],
"must_not": [
{
"wildcard": {
"path": {
"value": "/test/*"
}
}
}
]
}
}
}
然后我在not_analyzed
添加了title.not_analyzed
版本的标题字段,并尝试使用term
添加功能分数以增加完全匹配的权重。
{
"query": {
"function_score": {
"functions": [
{
"weight": 2,
"filter": {
"fquery": {
"query": {
"term": {
"title.not_analyzed": {
"value": "myterm"
}
}
}
}
}
}
],
"query": {
"bool": {
"must": [
{
"match": {
"title": {
"query": "myterm",
"fuzziness": 1
}
}
}
],
"must_not": [
{
"wildcard": {
"path": {
"value": "/path/*"
}
}
}
]
}
},
"boost_mode": "multiply"
}
}
}
但这给了我同样的结果。如何才能获得先返回的完全匹配?
答案 0 :(得分:4)
我们通过添加should
和boost
的组合找到了解决方法。
{
"size": 20,
"query": {
"bool": {
"must": [
{
"match": {
"title": {
"query": "myterm",
"fuzziness": 1
}
}
}
],
"must_not": [
{
"wildcard": {
"path": {
"value": "/path/*"
}
}
}
],
"should": [
{
"term": {
"title": {
"value": "myterm",
"boost": 10
}
}
}
]
}
}
}