簡體   English   中英

PHP中的Elasticsearch無法識別破折號

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

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