[英]Spring Boot elastic Search Query with constraint
我對這個彈性搜索和 spring 引導世界很陌生,我從過去的 2-3 天開始一直在嘗試搜索這個解決方案,遺憾的是我無法(可能是因為我是新手)。
我在彈性搜索中有 3 列,第一列是 ID,第二列是名稱(我在其上創建自動完成 API),第三個字段包含一組稱為數字的數字。 我的用例是對於第 3 列中的特定數字,我想要來自第 2 列的自動完成建議。
我已經用這段代碼實現了它並且它有效: repo.findByNumbersAndName(String, String)
但這不允許我設置模糊性、通配符查詢和其他搜索參數,所以我嘗試使用 QueryBuilders 但我在構建邏輯方面沒有成功(我基本上嘗試使用 BooleanQueryBuilder),所以如果有人可以幫助我這將非常有幫助!!
Spring 開機版本-2.4.2
提前致謝。
編輯1: -
為了更好地理解我的用例,假設這是我存儲在彈性搜索中的內容
Id | Name | Numbers |
-----------------------
a1 | ashwin | 1 |
a2 | Ram | 3 |
a3 | Kumar | 2 |
a4 | Some | 2 |
a5 | body | 1 |
a6 | any | 3 |
a7 | one | 4 |
a8 | ashwin | 2 |
現在我應該有控制權來指定我的查詢,說對於這個數字(比如說 1),如果輸入自動完成“a”,自動完成的可能性是什么。 然后程序應該只在數字列中搜索具有數字“1”的可能性,因此在這種情況下,只有一個 output 是“ashwin”。
編輯2: -
我相信我的配置和查詢方法和你所做的一樣,我只是粘貼我所做的。 一個更新是,雖然數據庫中的 Number 字段包含 Integers,但它們存儲為 String 數據類型,這在 term Query 時會有什么不同嗎?
這是我的彈性分析儀。json
{
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 30
}
},
"analyzer": {
"autocomplete_search": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"stop"
]
},
"autocomplete_index": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter",
"stop"
]
}
}
}
}
我正在使用它來生成查詢:-
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("Number", number))
.must(QueryBuilders.matchQuery("Name", search_word));
以上以這種格式生成查詢 -
{
"bool" : {
"must" : [
{
"term" : {
"Number" : {
"value" : "1",
"boost" : 1.0
}
}
},
{
"match" : {
"Name" : {
"query" : "ash",
"operator" : "OR",
"prefix_length" : 0,
"max_expansions" : 50,
"fuzzy_transpositions" : true,
"lenient" : false,
"zero_terms_query" : "NONE",
"auto_generate_synonyms_phrase_query" : true,
"boost" : 1.0
}
}
}
],
"adjust_pure_negative" : true,
"boost" : 1.0
}
這是產生空數組,不明白為什么? 我覺得下面的屬性相當於您在索引映射中提到的屬性
@Id
@Field(type = FieldType.Text)
private String Id;
@Field(type = FieldType.Text, analyzer = "autocomplete_index", searchAnalyzer = "autocomplete_search")
private String Name;
@Field(type = FieldType.Text)
private String Number;
謝謝@ECoder
編輯3: -
在@ESCoder 的幫助下,我也偶然發現了這一點,
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("Number", search_number).boost(1f).operator(Operator.AND))
.must(QueryBuilders.matchQuery("Name", keyword).boost(0.4f));
這是為 ElasticSearch 生成的查詢 spring,
{
"bool" : {
"must" : [
{
"match" : {
"Number" : {
"query" : "1",
"operator" : "AND",
"prefix_length" : 0,
"max_expansions" : 50,
"fuzzy_transpositions" : true,
"lenient" : false,
"zero_terms_query" : "NONE",
"auto_generate_synonyms_phrase_query" : true,
"boost" : 1.0
}
}
},
{
"match" : {
"Name" : {
"query" : "ash",
"operator" : "OR",
"fuzziness" : "1",
"prefix_length" : 0,
"max_expansions" : 50,
"fuzzy_transpositions" : true,
"lenient" : false,
"zero_terms_query" : "NONE",
"auto_generate_synonyms_phrase_query" : true,
"boost" : 0.4
}
}
}
],
"adjust_pure_negative" : true,
"boost" : 1.0
}
}
添加帶有索引數據、映射、搜索查詢和搜索結果的工作示例
索引映射:
{
"settings": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 4
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
},
"mappings": {
"properties": {
"Name": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
},
"Id": {
"type": "text"
},
"Numbers": {
"type": "integer"
}
}
}
}
指數數據:
{
"Name": "ashwin",
"Id": "a1",
"Numbers": 1
}
{
"Name": "ashwin",
"Id": "a1",
"Numbers": 2
}
搜索查詢:
{
"query": {
"bool": {
"must": [
{
"match": {
"Name": "a"
}
},
{
"term": {
"Numbers": 1
}
}
]
}
}
}
搜索結果:
"hits": [
{
"_index": "66923434",
"_type": "_doc",
"_id": "1",
"_score": 1.2630212,
"_source": {
"Name": "ashwin",
"Id": "a1",
"Numbers": 1
}
}
]
更新1:
使用您當前的索引映射設置,將為ashwin
生成以下標記
GET /_analyze
{
"analyzer" : "autocomplete",
"text" : "ashwin"
}
令牌是:
{
"tokens": [
{
"token": "ash",
"start_offset": 0,
"end_offset": 6,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "ashw",
"start_offset": 0,
"end_offset": 6,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "ashwi",
"start_offset": 0,
"end_offset": 6,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "ashwin",
"start_offset": 0,
"end_offset": 6,
"type": "<ALPHANUM>",
"position": 0
}
]
}
您需要修改索引映射,而不是"min_gram": 3
您需要將其更改為"min_gram": 1
。
更新 2:
您甚至需要將"search_analyzer"
更改為standard
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.