根据字段值提升ElasticSearch结果

zaq*_*zaq 2 elasticsearch

我是一个ElasticSearch菜鸟,我试图弄清楚如何在"标题"字段中提高包含搜索词的搜索结果的相关性.例如,如果有两个文件:

  1. Title="Test Form" Description="This is a new form"
  2. Title="New Form" Description="Test test test"

并且用户在所有字段中搜索"测试",因为搜索项出现在标题字段中,所以文档1应该被提升.

我试图在这里遵循文档,但我不确定我应该包含该命令的上下文.它是应用于索引还是搜索或者?它是否需要成为另一个元素的一部分,还是可以作为单独的命令发布?

这是我到目前为止所做的,5个文档被索引,然后应用提升,最后,在所有字段中搜索字符串"test".

PUT http://localhost:9200//global/Form/456
{
  "KeyWords": "",
  "OneLineDesc": "Test",
  "Link": "",
  "Title": "Test Form"
}

PUT http://localhost:9200//global/Form/457 
{
  "KeyWords": "",
  "OneLineDesc": "",
  "Link": "",
  "Title": "Another Form"
}

PUT http://localhost:9200//global/Form/458 
{
  "KeyWords": "",
  "OneLineDesc": "test form",
  "Link": "",
  "Title": "Ryans Form"
}

PUT http://localhost:9200//global/Form/460 
{
  "KeyWords": "",
  "OneLineDesc": "",
  "Link": "",
  "Title": "permissions test"
}

PUT http://localhost:9200//global/Form/576 
{
  "KeyWords": "",
  "OneLineDesc": "Test test test test test test test test",
  "Link": "",
  "Title": "My Test Form"
}

POST http://localhost:9200//global/Form 
{
  "_boost": {
    "name": "Title",
    "null_value": 20
  }
}

POST http://localhost:9200/_search?search_type=query_then_fetch 
{
  "from": 0,
  "size": 10,
  "query": {
    "match": {
      "_all": {
        "query": "test"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,无论是否在索引之后发出boost命令,结果中的分数都是相同的.

我更倾向于在索引编制期间执行此提升操作,因为标题字段将被视为比所有文档中的其他字段更重要.此外,在上面的示例中,每个文档的字段都是常量,但通常情况并非如此,但所有文档都将始终具有标题字段.每个搜索都需要在所有可用字段上执行.

Zac*_*ach 11

一些东西.首先,必须索引文档之前指定索引时间提升.升级值在索引时会被刻录到文档中,这意味着在索引文档之后无法对其进行提升.

这使得索引时间提升非常不灵活,并且通常难以使​​用.建议不要使用索引时间提升,因为您可以通过查询时提升来完成相同的操作,并仍然保持灵活性.一般来说,人们希望在不需要重新索引数据的情况下调整提升和评分.

我要做的是使用多匹配查询,它给你几个不错的行为.这是一个例子(注意,你应该使用小写索引和类型名称).首先,像以前一样索引数据:

DELETE /global

PUT /global/form/456 
{
  "KeyWords": "",
  "OneLineDesc": "Test",
  "Link": "",
  "Title": "Test Form"
}

PUT /global/form/457 
{
  "KeyWords": "",
  "OneLineDesc": "",
  "Link": "",
  "Title": "Another Form"
}

PUT /global/form/458 
{
  "KeyWords": "",
  "OneLineDesc": "test form",
  "Link": "",
  "Title": "Ryans Form"
}

PUT /global/form/460 
{
  "KeyWords": "",
  "OneLineDesc": "",
  "Link": "",
  "Title": "permissions test"
}

PUT /global/form/576 
{
  "KeyWords": "",
  "OneLineDesc": "Test test test test test test test test",
  "Link": "",
  "Title": "My Test Form"
}
Run Code Online (Sandbox Code Playgroud)

现在使用多重匹配来同时搜索和提升:

POST /global/form/_search
{
    "query": {
        "multi_match": {
           "query": "test",
           "fields": ["Title^5", "_all"]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

multi_match允许您使用对多个字段匹配查询.在这个例子中,我们正在搜索Title_all.字段^5上的插入符号()Title向标题字段添加5的提升值,这意味着匹配Title比其他任何字段上的匹配更高.这会使搜索结果偏斜,使得标题匹配显示在顶部.

此外,默认情况下multi_match使用dis_max查询,这是您想要的一般行为.通常,dis_max优先匹配发生在单个字段中,而不是分布在多个字段中.

例如,quick fox标题字段中的匹配得分高于quick标题和fox正文中的匹配.