我是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字段添加提升?如果有更多语言,还有更好的方法吗?
谢谢和问候。
答案 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"}
由于