弹性搜索Hightlight与copy_to

时间:2018-05-24 12:56:50

标签: elasticsearch

我使用以下映射创建了索引:

public static void main(String[] args) {
    Timer timer = new Timer();
    TimerTask tt = new TimerTask() {
        public void run() {
            Calendar cal = Calendar.getInstance();

            int hour = cal.get(Calendar.HOUR_OF_DAY);
            int min = cal.get(Calendar.MINUTE);
            if (hour == 18 && min == 20) {
                doSomething();
            }
        }
    };
    timer.schedule(tt, 1000, 5000);
}

我在其中添加了以下两个文档:

PUT test
 {
    "mappings": {
        "documents": {
            "properties": {
                "name": {
                    "type": "keyword"
                },

                "fields": {
                    "type": "nested",
                    "properties": {
                        "uid": {
                            "type": "keyword"
                        },
                        "value": {
                            "type": "text",
                            "copy_to": "fulltext"
                        }
                    }
                },
                "fulltext": {
                    "type": "text"
                },
                "locale": {
                    "type": "keyword"
                },
                "title": {
                    "type": "text",
                    "fields": {
                        "raw": {
                            "type": "keyword"
                        }
                    }
                },
                "url": {
                    "type": "text",
                    "fields": {
                        "raw": {
                            "type": "keyword"
                        }
                    }
                }
            }
        }
    }
 }

并使用以下查询搜索结果:

POST test/documents/10
{
  "title":"java",
  "url":"/java",
  "name":"two",
  "locale":"en-us",
  "fields":[{
    "uid":"group.name",
    "value":"my demo"
  },{
    "uid":"group.last",
    "value":"test"
  }]
}

POST test/documents/11
{
  "title":"php",
  "url":"/php",
  "name":"one",
  "locale":"en-us",
  "fields":[{
    "uid":"group.name",
    "value":"demo"
  },{
    "uid":"group.last",
    "value":"test"
  }]
}

并获得以下结果:

GET test/_search
{
    "size": 10,
    "query": {
        "bool": {
            "must": [{
                "simple_query_string": {
                    "query": "my",
                    "fields": ["title^6", "url^4", "fulltext"]
                }
            }, {
                "terms": {
                    "locale": ["en-us"]
                }
            }, {
                "terms": {
                    "name": ["one","two"]
                }
            }]
        }
    },
    "highlight": {
        "pre_tags": ["<b>"],
        "post_tags": ["</b>"],
        "fields": {
            "*": {}
        }
    }
}

以上响应突出显示名称和区域设置部分。我不想突出显示名称和区域设置我只想突出显示我正在搜索的文本(这里是我的文字)。

如何从突出显示中删除名称和区域设置并突出显示实际的字词(此处为“my”)

请帮帮我这个?

2 个答案:

答案 0 :(得分:0)

您的查询存在以下问题 - 简单查询字符串具有特殊语法。在您的情况下,如果它是my,则表示implicitly它是should条款,这意味着匹配不需要它。这就是为什么你没有突出显示这个my值。您需要更改查询或在+之前设置my才能进行此匹配 - 需要。

关于查询的其他部分,您不希望在突出显示中看到,您可以指定要突出显示的字段,而不是

中的*
"fields": {
            "*": {}
}

你可以拥有你想要的字段 - 在你的情况下,我认为它是title, url, fulltext。请查看documentation以查看

答案 1 :(得分:0)

只要强调不突出显示所有内容&#34; *&#34;在田野里。

另外,如果您只需要1/0作为搜索中的分数,我建议您在过滤器中添加术语搜索。

GET test/_search
{
  "size": 10,
  "query": {
    "bool": {
      "must": [
        {
          "simple_query_string": {
            "query": "my",
            "fields": [
              "title^6",
              "url^4",
              "fulltext"
            ]
          }
        }
      ],
      "filter": [
        {
          "terms": {
            "locale": [
              "en-us"
            ]
          }
        },
        {
          "terms": {
            "name": [
              "one",
              "two"
            ]
          }
        }
      ]
    }
  },
  "highlight": {
    "pre_tags": [
      "<b>"
    ],
    "post_tags": [
      "</b>"
    ],
    "fields": {
      "name": {},
      "title":{},
      "url": {},
      "fulltext": {}
    }
  }
}