1

여기 elasticSearch 내 필드 :ElasticSearch 분석기

"custom_stop": { 
     "type":  "custom", 
     "tokenizer": "standard", 
     "filter": [ 
     "my_stop", 
     "my_snow", 
     "asciifolding" 
     ] 
    } 

그리고 여기 내 필터입니다 :

여기
"keywordName": { 
     "type": "text", 
     "analyzer": "custom_stop" 
     } 

내 분석기 여기에

  "my_stop": { 
       "type":  "stop", 
       "stopwords": "_french_" 
      }, 
      "my_snow" : { 
       "type" : "snowball", 
       "language" : "French" 
      } 

이 내 내 유일한 위치 : keywordName의 색인 생성 :

"canne a peche", "canne a peche telescopique", "iphone 8", "iphone 8 case", "iphone 8 cover", "iphone 8 charger", "iphone 8 new"

나는 "칸느"를 검색 할 때

, 그것은 내가 원하는 무엇을하는 나에게 "칸느"문서를 제공합니다 : 나는 "칸느 à PECHE"를 검색 할 때

GET ads/_search 
{ 
    "query": { 
    "match": { 
     "keywordName": { 
     "query": "canne", 
     "operator": "and" 
     } 
    } 
    }, 
    "size": 1 
} 

, 그것은 "칸느 페쉬"저를 준다, 괜찮아. "Cannes à Pêche"-> "canne a peche"-> OK와 동일합니다.

여기 까다로운 부분이 있습니다. "iphone 8"을 검색하면 "iphone 8"대신 "iphone 8 cover"가 표시됩니다. 크기를 변경하면 5로 설정됩니다 ("iphone 8"이 포함 된 5 개의 결과를 반환 함). 나는 "iphone 8"이 점수의 기간에있는 제 4 결과다는 것을 봅니다.

{ 
    "took": 5, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 5, 
    "max_score": 1.4009607, 
    "hits": [ 
     { 
     "_index": "ads", 
     "_type": "keyword", 
     "_id": "iphone 8 cover", 
     "_score": 1.4009607, 
     "_source": { 
      "keywordName": "iphone 8 cover" 
     } 
     }, 
     { 
     "_index": "ads", 
     "_type": "keyword", 
     "_id": "iphone 8 case", 
     "_score": 1.4009607, 
     "_source": { 
      "keywordName": "iphone 8 case" 
     } 
     }, 
     { 
     "_index": "ads", 
     "_type": "keyword", 
     "_id": "iphone 8 new", 
     "_score": 0.70293105, 
     "_source": { 
      "keywordName": "iphone 8 new" 
     } 
     }, 
     { 
     "_index": "ads", 
     "_type": "keyword", 
     "_id": "iphone 8", 
     "_score": 0.5804671, 
     "_source": { 
      "keywordName": "iphone 8" 
     } 
     }, 
     { 
     "_index": "ads", 
     "_type": "keyword", 
     "_id": "iphone 8 charge", 
     "_score": 0.46705723, 
     "_source": { 
      "keywordName": "iphone 8 charge" 
     } 
     } 
    ] 
    } 
} 

어떻게 : 첫 번째는 "아이폰 8 커버"다음 "아이폰 8의 경우"다음 "아이폰 8 새로운"그리고 마지막으로 "아이폰 8"... 여기

쿼리의 결과입니다 나는 키워드 "canne a peche"(악센트, 대문자, 복수형 용어)에 관한 유연성을 유지하면서 정확하게 일치하는 항목 ("iphone 8"= "iphone 8")이 있으면 정확히 keywordName을 알려주겠습니까?

답변

1

나는이 같은 제안 :

"keywordName": { 
     "type": "text", 
     "analyzer": "custom_stop", 
     "fields": { 
     "raw": { 
      "type": "keyword" 
     } 
     } 
    } 

그리고 쿼리 :

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match": { 
      "keywordName": { 
       "query": "iphone 8", 
       "operator": "and" 
      } 
      } 
     }, 
     { 
      "term": { 
      "keywordName.raw": { 
       "value": "iphone 8" 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "size": 10 
} 
+0

이것은 내가 찾고 있었던 행동입니다! Thx – Gun

+0

"가장 가까운 일치"결과를 높일 수 있습니까? 내 말은 -> "sâmsung"을 검색하면 1 개의 토큰이 있습니다 : "samsung". 그러나 가장 좋은 점수는 "삼성 갤럭시"(1.11), "삼성 충전기"(0.94) 및 "삼성"(0.84)입니다. 어떻게 "sAMM"을 "sâmsung"에 가장 근접하게 부스트라고 말할 수 있습니까? 그리고 "삼성 은하"또는 "삼성 충전기"가 아닙니다. – Gun

1

일치 쿼리는 tf/idf 알고리즘을 사용합니다. 즉, 빈도별로 정렬 된 퍼지 검색 결과를 얻게됩니다. 정확히 일치하는 결과를 얻으려면 이전에 query_string 대/소문자를 작성하고 결과가없는 경우에는 일치 쿼리를 사용해야합니다.

+0

그래서 난 내 기대를 충족 2 개 쿼리를 사용할 수 있나요? – Gun

+0

이것이 내가 보는 방법입니다. 나는 또한 왜 아이폰 8이 4 번째 결과인지 이해하지 못한다. tf/idf는 가장 높은 빈도를 제공해야합니다. – RoiHatam

+0

@Gun은 size = 5 인 검색 결과로 표시 할 수 있습니다. – RoiHatam