• multi_match查询
    • 在字段名中使用通配符
    • 加权个别字段

    multi_match查询

    multi_match查询提供了一个简便的方法用来对多个字段执行相同的查询。

    提示:存在几种类型的multi_match查询,其中的3种正好和在“单一查询字符串”小节中”了解你的数据”单元中提到的几种类型相同:best_fields,most_fields以及cross_fields。

    默认情况下,该查询以best_fields类型执行,它会为每个字段生成一个match查询,然后将这些查询包含在一个dis_max查询中。下面的dis_max查询:

    1. {
    2. "dis_max": {
    3. "queries": [
    4. {
    5. "match": {
    6. "title": {
    7. "query": "Quick brown fox",
    8. "minimum_should_match": "30%"
    9. }
    10. }
    11. },
    12. {
    13. "match": {
    14. "body": {
    15. "query": "Quick brown fox",
    16. "minimum_should_match": "30%"
    17. }
    18. }
    19. },
    20. ],
    21. "tie_breaker": 0.3
    22. }
    23. }

    可以通过multi_match简单地重写如下:

    1. {
    2. "multi_match": {
    3. "query": "Quick brown fox",
    4. "type": "best_fields", <1>
    5. "fields": [ "title", "body" ],
    6. "tie_breaker": 0.3,
    7. "minimum_should_match": "30%" <2>
    8. }
    9. }

    // SENSE: 110_Multi_Field_Search/25_Best_fields.json

    <1> 注意到以上的type属性为best_fields。

    <2> minimum_should_match和operator参数会被传入到生成的match查询中。

    在字段名中使用通配符

    字段名可以通过通配符指定:任何匹配了通配符的字段都会被包含在搜索中。你可以通过下面的查询来匹配book_title,chapter_title以及section_title字段:

    1. {
    2. "multi_match": {
    3. "query": "Quick brown fox",
    4. "fields": "*_title"
    5. }
    6. }

    加权个别字段

    个别字段可以通过caret语法(^)进行加权:仅需要在字段名后添加^boost,其中的boost是一个浮点数:

    1. {
    2. "multi_match": {
    3. "query": "Quick brown fox",
    4. "fields": [ "*_title", "chapter_title^2" ] <1>
    5. }
    6. }

    <1> chapter_title字段的boost值为2,而book_title和section_title字段的boost值为默认的1。