我是一个ElasticSearch菜鸟,我试图弄清楚如何在“标题”字段中提高包含搜索词的搜索结果的相关性。例如,如果有两个文件:
Title="Test Form" Description="This is a new form"
Title="New Form" Description="Test test test"
用户在所有字段中搜索“测试”,文档1 应该得到提升,因为搜索字词出现在标题字段中。
我试图遵循文档here,但我不确定应该包含该命令的上下文。它是应用于索引还是搜索或者?它是否需要成为另一个元素的一部分,还是可以作为单独的命令发布?
到目前为止,我已经完成了5个文档的索引,然后应用了boost,最后,在所有字段中对字符串“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"
}
}
}
}
但是,无论是否在索引之后发出boost命令,结果中的分数都是相同的。
我更倾向于在索引编制期间执行此提升操作,因为标题字段将被视为比所有文档中的其他字段更重要。此外,在上面的示例中,每个文档的字段都是常量,但通常情况并非如此,尽管所有文档都将始终具有标题字段。每个搜索都需要在所有可用字段上执行。
答案 0 :(得分: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"
}
现在使用多重匹配来同时搜索和提升:
POST /global/form/_search
{
"query": {
"multi_match": {
"query": "test",
"fields": ["Title^5", "_all"]
}
}
}
multi_match
允许您对多个字段使用匹配查询。在此示例中,我们正在搜索Title
和_all
。 ^5
字段上的插入符号Title
会在标题字段中添加5的提升值,这意味着Title
上的匹配项比其他任何字段上的匹配项都要高。这会使搜索结果偏斜,使得标题匹配显示在顶部。
此外,multi_match
默认使用dis_max
查询,这是您想要的一般行为。通常,dis_max
支持在单个字段中发生的匹配,而不是分布在多个字段中。
例如,标题字段中quick fox
的匹配得分高于标题中quick
与正文中fox
的匹配。