Как задать разные веса для точных, телефонных c и нечетких запросов? - PullRequest
0 голосов
/ 20 марта 2020

Примечание: я получил этот ответ, но не смог решить проблему.

Поэтому в настоящее время я использую следующий запрос:

{
    "_source": [
        "title",
        "bench",
        "id_",
        "court",
        "date"
    ],
    "size": 15,
    "from": 0,
    "query": {
        "bool": {
            "must": {
                "multi_match": {
                    "query": "knife",
                    "fields": [
                        "title",
                        "body"

                    ],
                    "operator": "and"
                }
            },
            "should": {
                "multi_match": {
                    "query": "knife",
                    "fields": [
                        "title",
                        "body"
                    ],
                    "fuzziness" : 1,
                    "operator": "and"
                }
            }
        }
    },
    "highlight": {
        "pre_tags": [
            "<tag1>"
        ],
        "post_tags": [
            "</tag1>"
        ],
        "fields": {
            "content": {}
        },
        "fragment_size": 30
    }
}

Что я хочу добиться того, чтобы я хотел дать разные веса точным, phoneti c и нечетким запросам в точном порядке> fuzzy> phoneti c. Как мне добиться этого?

Это мое отображение - (Мой анализатор - это Метафонный анализатор)

{
    "courts_2": {
        "mappings": {
            "properties": {
                "author": {
                    "type": "text",
                    "analyzer": "my_analyzer"
                },
                "bench": {
                    "type": "text",
                    "analyzer": "my_analyzer"
                },
                "citation": {
                    "type": "text"
                },
                "content": {
                    "type": "text",
                    "fields": {
                        "standard": {
                            "type": "text"
                        }
                    },
                    "analyzer": "my_analyzer"
                },
                "court": {
                    "type": "text"
                },
                "date": {
                    "type": "text"
                },
                "id_": {
                    "type": "text"
                },
                "title": {
                    "type": "text",
                    "fields": {
                        "standard": {
                            "type": "text"
                        }
                    },
                    "analyzer": "my_analyzer"
                },
                "verdict": {
                    "type": "text"
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 23 марта 2020

Вы можете индексировать поля phoneti c в отдельном подполе следующим образом:

   "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "fields": {
          "phonetic": {
            "type": "text",
            "analyzer": "my_analyzer"
          }
        }}}}

Затем вы можете выполнить запрос Оценка функции , чтобы получить точный порядок> fuzzy> phoneti c:

{
  "_source": [
    "title",
    "bench",
    "id_",
    "court",
    "date"
  ],
  "size": 15,
  "from": 0,
  "query": {
    "bool": {
      "should": [
        {
          "function_score": {
            "query": {
              "multi_match": {
                "query": "knife",
                "fields": [
                  "title",
                  "body"
                ],
                "operator": "and"
              }
            },
            "boost": 3
          }
        },
        {
          "function_score": {
            "query": {
              "multi_match": {
                "query": "knife",
                "fields": [
                  "title",
                  "body"
                ],
                "fuzziness": 1,
                "operator": "and"
              }
            },
            "boost": 2
          }
        },
        {
          "function_score": {
            "query": {
              "multi_match": {
                "query": "knife",
                "fields": [
                  "title.phonetic",
                  "body.phonetic"
                ],
                "operator": "and"
              }
            },
            "boost": 1
          }
        }
      ]
    }
  }
}

Надеюсь, это поможет!

...