簡體   English   中英

Spring 帶約束的引導彈性搜索查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM