Как дать более высокий балл точным поискам, чем phoneti c в Elasticsearch? - PullRequest
0 голосов
/ 06 февраля 2020

Я использую анализатор phoneti c от Elasticsearch. Я хочу, чтобы запрос дал более высокую оценку точным совпадениям, чем phoneti c. Вот запрос, который я использую:


{
    "query": {
        "multi_match" : {
            "query" : "Abhijeet",
            "fields" : ["content", "title"]




        }
    },         
     "size": 10,
     "_source": [ "title", "bench", "court", "id_" ],
     "highlight": {
        "fields" : {
            "title" : {},
            "content":{}
        }
    }

}


Когда я ищу Abhijeet, самые популярные запросы - Abhijit, и только позже приходит Abhijeet. Я хочу, чтобы сначала появлялись точные совпадения, а затем телефонные c. Можно ли это сделать?

Редактировать:

Отображения

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

Вот код, который я использовал для настройки анализатор phoneti c:

{
    "settings": {
        "index": {
            "analysis": {
                "analyzer": {
                    "my_analyzer": {
                        "tokenizer": "standard",
                        "filter": [
                            "lowercase",
                            "my_metaphone"
                        ]
                    }
                },
                "filter": {
                    "my_metaphone": {
                        "type": "phonetic",
                        "encoder": "metaphone",
                        "replace": true
                    }
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "author": {
                "type": "text",
                "analyzer": "my_analyzer"
            },
            "bench": {
                "type": "text",
                "analyzer": "my_analyzer"
            },
            "citation": {
                "type": "text"
            },
            "content": {
                "type": "text",
                "analyzer": "my_analyzer"
            },
            "court": {
                "type": "text"
            },
            "date": {
                "type": "text"
            },
            "id_": {
                "type": "text"
            },
            "title": {
                "type": "text",
                "analyzer": "my_analyzer"
            },
            "verdict": {
                "type": "text"
            }
        }
    }
}

Теперь я хочу запросить только поля title и content. Здесь я хочу, чтобы сначала отображались точные совпадения, а затем телефонные c.

1 Ответ

1 голос
/ 07 февраля 2020

Общий подход к решению:

  • для использования bool -запроса
  • с вашим запросом / запросами ponecti c в предложении must,
  • и non / phoneti c запрос / запросы в разделе must

Я могу обновить ответ, если вы включите сопоставления и настройки вашего индекса в свой вопрос.

Обновление: подход к решению

A. Расширьте свое сопоставление, чтобы использовать мультиполя для title и content:

"title": {
  "type": "text",
  "analyzer": "my_analyzer",
  "fields" : {
    "standard" : {
      "type" : "text"
    }
  }
},
...
"content": {
  "type": "text",
  "analyzer": "my_analyzer"
  "fields" : {
    "standard" : {
      "type" : "text"
    }
  }
},

B. Получите заполненные поля (например, переиндексировав все):

POST courts_2/_update_by_query

C. Настройте свой запрос, чтобы использовать недавно введенные поля:

GET courts_2/_search
{
  "_source": ["title","bench","court","id_"],
  "size": 10,
  "query": {
    "bool": {
      "must": {
        "multi_match": {
          "query": "Abhijeet",
          "fields": ["title", "content"]
        }
      },
      "should": {
        "multi_match": {
          "query": "Abhijeet",
          "fields": ["title.standard", "content.standard"]
        }
      }
    }
  },
  "highlight": {
    "fields": {
      "title": {},
      "content": {}
    }
  }
}
...