[英]Elasticsearch in php doesn't recognize dash
我正在一個項目上,嘗試用elasticsearch進行搜索,但是我的字段可能包含破折號,當我用它搜索時,找不到所需的結果,因此我嘗試更改映射,但更改索引根本不起作用。 我沒有任何錯誤消息,但是即使使用其他字段也找不到我索引的內容。 所以我所做的是:
$params = [
'index' => 'arc',
'type' => 'purchase',
'id' => $purchase['id'],
'body' => $purchase
];
除了帶有破折號的字段外,它的效果都很好。 我的$purchase
看起來像這樣:
array:34 [
"id" => 163160
"distant" => "MOR-938BBM28147090"
[...]
]
因此,當我搜索“ MOR”時,我找到了結果,但是當我執行“ MOR-”時,什么也沒有。 我試圖通過這樣做來更改映射:
$params = [
'index' => 'arc',
'type' => 'purchase',
'id' => $purchase['id'],
'body' => [
'mappings' => [
'_default_' => [
'properties' => [
'distant' => [
'type' => 'string',
'index' => 'not_analyzed'
]
]
]
],
$purchase
]
];
但是,即使我嘗試搜索“ 163160”,也找不到任何結果。
在這種情況下, 空白分析儀可能是正確的解決方案。 它在將文本分成標記時僅考慮空格,並且像“-”或“ _”之類的字符仍被視為術語的一部分。
但是,如果您需要進行部分匹配,例如使用"MOR-"
令牌,則需要進行一些更為復雜的映射。
由於我不了解php,因此我將使用Elasticsearch語法。 首先,創建適當的映射:
PUT http://127.0.0.1:9200/arc
{
"settings": {
"analysis": {
"analyzer": {
"edge_ngram_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 18,
"token_chars": [
"letter",
"digit",
"punctuation"
]
}
}
}
},
"mappings": {
"purchase": {
"properties": {
"distant": {
"type": "string",
"analyzer": "edge_ngram_analyzer"
}
}
}
}
}
如您所見,我在這里使用EdgeNGram標記器。 當您在distant
字段中使用MOR-938BBM28147090
為文檔建立索引時,它將創建以下標記:
[MOR, MOR-, MOR-9, MOR-93, MOR-938, MOR-938B, MOR-938BB, ...]
這里的核心點是token_chars
列表中的punctuation
類,它告訴token_chars
破折號(以及其他字符,如!或“)應包含在令牌中,而不應被視為“ split char”。
現在,當我索引文檔時:
PUT http://127.0.0.1:9200/arc/purchase/163160
{
"distant": "MOR-938BBM28147090"
}
並運行術語搜索查詢:
POST http://127.0.0.1:9200/arc/purchase/_search
{
"query": {
"bool" : {
"must" : {
"term" : {
"distant": "MOR-93"
}
}
}
}
}
我得到回應:
"hits": {
"total": 1,
"max_score": 0.6337049,
"hits": [
{
"_index": "arc",
"_type": "purchase",
"_id": "163160",
"_score": 0.6337049,
"_source": {
"distant": "MOR-938BBM28147090"
}
}
]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.