Elasticsearch:使用提升搜索_all字段

时间:2014-07-22 20:55:33

标签: elasticsearch

我是Elasticsearch的新手。

我有以下映射:

{
    "mappings": {

        "book": {

            "properties": {         
                "title": {
                    "properties": {
                        "en": {
                            "type": "string",
                            "analyzer": "standard"
                        },
                        "ar": {
                            "type": "string",
                            "analyzer": "standard"
                        }
                    }
                },

                "keyword": {
                    "properties": {
                        "en": {
                            "type": "string",
                            "analyzer": "standard"
                        },
                        "ar": {
                            "type": "string",
                            "analyzer": "standard"
                        }
                    }
                }
            }
        }
    }
}

示例文档可能有两种语言用于同一本书的同一字段。以下是两个示例文档:

{
    "title" : {
        "en": "hello",
        "ar": "مرحبا"
    },
    "keyword" : {
        "en": "world",
        "ar": "عالم"
    }   
}

{
    "title" : {
        "en": "Elasticsearch"
    },
    "keyword" : {
        "en": "full-text index"
    }   
}

现在我想对_all字段进行搜索。这是我的疑问:

"query": { 
    "match" : {
        "_all" : {
            "query" : "hello",
            "operator" : "OR"
        }
    }
}

这是正确的映射吗?我想使用_all字段而不是在查询中列出特定字段的原因之一是我将包含更多语言。

我不确定的是如何在上面的查询中为title.en,title.ar字段添加提升?如果有更多语言,还有更好的方法吗?

谢谢和问候。

2 个答案:

答案 0 :(得分:2)

您可以使用function_score query

来实现
{
   "query": {
      "function_score": {
         "functions": [
            {
               "boost_factor": "500",
               "filter": {
                  "term": {
                     "title.en": "hello"
                  }
               }
            },
            {
               "boost_factor": "200",
               "filter": {
                  "term": {
                     "title.ar": "hello"
                  }
               }
            }
         ],
         "query": {
            "match": {
               "_all": {
                  "query": "hello",
                  "operator": "OR"
               }
            }
         },
         "score_mode": "sum"
      }
   }
}

添加标题。*

{
   "query": {
      "function_score": {
         "functions": [
            {
               "boost_factor": "500",
               "filter": {
                   "query": {
                      "query_string": {
                           "default_field": "title.*",
                            "query": "hello"
                       }
                   }
               }
            }
         ],
         "query": {
            "match": {
               "_all": {
                  "query": "hello",
                  "operator": "OR"
               }
            }
         },
         "score_mode": "sum"
      }
   }
}

答案 1 :(得分:1)

您应该在映射中添加:

_all" : {"enabled" : true}

有关映射检查的示例this

您可以在案例中使用_all字段,因为它适合您的要求。 ElasticSearch Documentation声明:

  

_all字段的想法是它包含一个或多个文本   索引文档中的其他字段。它可以非常方便   特别是对于我们想要执行搜索的搜索请求   查询文档内容,而不知道哪些字段   搜索。这是以CPU周期和索引大小为代价的。

您正在使用匹配查询。仅当_all字段中存在完全匹配时,它才有效。默认情况下,使用标准分析器分析_all字段。所以使用匹配搜索hello world可能不会返回命中。在这种情况下我会建议使用query_string或multi_match要好得多。您可以为_all字段指定自定义分析器,如:

"_all" : {"type" : "string", "analyzer" : "your_custom_analyzer"}

由于