首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全文与knn_vector混合搜索弹性

全文与knn_vector混合搜索弹性
EN

Stack Overflow用户
提问于 2021-05-26 08:34:34
回答 1查看 676关注 0票数 2

我目前正在开发一个搜索引擎,我已经开始实现语义搜索。我使用了弹性的开放发行版,我的地图现在看起来是这样的:

代码语言:javascript
复制
{
  "settings": {
    "index": {
      "knn": true,
      "knn.space_type": "cosinesimil"
    }
  },
  "mappings": {
    "properties": {
      "title": { 
        "type" : "text"
      },
      "data": { 
        "type" : "text"
      },
      "title_embeddings": {
        "type": "knn_vector", 
        "dimension": 600
      },
      "data_embeddings": {
        "type": "knn_vector", 
        "dimension": 600
      }
    }
  }
}

对于基本的knn_vector搜索,我使用以下方法:

代码语言:javascript
复制
{
  "size": size,
  "query": {
    "script_score": {
      "query": {
        "match_all": { }
      },
      "script": {
        "source": "cosineSimilarity(params.query_value, doc[params.field1]) + cosineSimilarity(params.query_value, doc[params.field2])",
        "params": {
          "field1": "title_embeddings",
          "field2": "data_embeddings",
          "query_value": query_vec
        }
      }
    }
  }
}

我找到了一种混合搜索

代码语言:javascript
复制
{
  "size": size,
  "query": {
    "function_score": {
      "query": {
        "multi_match": { 
          "query": query,
          "fields": ["data", "title"]
        }
      },
      "script_score": {
        "script": {
          "source": "cosineSimilarity(params.query_value, doc[params.field1]) + cosineSimilarity(params.query_value, doc[params.field2])",
          "params": {
            "field1": "title_embeddings",
            "field2": "data_embeddings",
            "query_value": query_vec
          }
        }
      }
    }
  }
}

问题是,如果我在文档中没有这个词,那么它就不会被返回。例如,对于第一个搜索查询,当我搜索trump (不在我的数据集中)时,我设法获得关于社交网络和政治的文档。我没有混合搜索的结果。

我试过这样做:

代码语言:javascript
复制
 {
  "size": size,
  "query": {
    "function_score": {
      "query": {
        "match_all": { }
      },
      "functions": [
      {
        "filter" : {
          "multi_match": { 
            "query": query,
            "fields": ["data", "title"]
          }
        },
        "weight": 1
      },
      {
        "script_score" : {
          "script" : {
            "source": "cosineSimilarity(params.query_value, doc[params.field1]) + cosineSimilarity(params.query_value, doc[params.field2])",
            "params": {
              "field1": "title_embeddings",
              "field2": "data_embeddings",
              "query_value": query_vec
            }
          }
        },
        "weight": 4
      }
      ],
      "score_mode": "sum",
      "boost_mode": "sum"
    }
  }
}

但是多匹配部分给所有匹配的文档以恒定的分数,我想使用过滤器对我的文档进行排序,就像在正常的全文查询中一样。有什么办法吗?还是我应该用另一种策略?提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-26 09:30:46

在Archit Saxena的帮助下,我的问题得到了解决:

代码语言:javascript
复制
{
  "size": size,
  "query": {
    "function_score": {
      "query": {
        "bool": { 
          "should" : [
            {
              "multi_match" : { 
                "query": query,
                "fields": ["data", "title"]
              }
            },
            {
              "match_all": { }
            }
          ],
          "minimum_should_match" : 0
        }
      },
      "functions": [
      {
        "script_score" : {
          "script" : {
            "source": "cosineSimilarity(params.query_value, doc[params.field1]) + cosineSimilarity(params.query_value, doc[params.field2])",
            "params": {
              "field1": "title_embeddings",
              "field2": "data_embeddings",
              "query_value": query_vec
            }
          }
        },
        "weight": 20
      }
      ],
      "score_mode": "sum",
      "boost_mode": "sum"
    }
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67701323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档