2012-10-08 2 views
0

elasticsearch의 패싯 기능을 사용하여 단어와 구의 tagcloud를 만들려고합니다."패싯"쿼리에서 제공되는 "제외"단어 옵션을 사용하여 n 개의 단조 (n - gram) 패싯을 필터링 할 수 없습니다

내 매핑 : 생성 측면에 대한

curl -XPOST http://localhost:9200/myIndex/ -d '{ 

    ... 

    "analysis":{ 
    "filter":{ 
     "myCustomShingle":{ 
     "type":"shingle", 
     "max_shingle_size":3, 
     "output_unigrams":true 
     } 
    }, 
    "analyzer":{ //making a custom analyzer 
     "myAnalyzer":{ 
     "type":"custom", 
     "tokenizer":"standard", 
     "filter":[ 
      "lowercase", 
      "myCustomShingle", 
      "stop" 
     ] 
     } 
    } 
    } 

    ... 
}, 
"mappings":{ 

    ... 


    "description":{ //the field to be analyzed for making the tag cloud 
    "type":"string", 
    "analyzer":"myAnalyzer", 
    "null_value" : "null" 
    }, 


    ... 



} 

검색어 :

curl -X POST "http://localhost:9200/myIndex/myType/_search?&pretty=true" -d ' 
{ 
    "size":"0", 

    "query": { 
    match_all:{} 
    }, 


    "facets": { 
    "blah": { 
     "terms": { 
     "fields" :  ["description"], 
     "exclude" : [ 'evil' ], //remove facets that contain these words 
     "size": "50" 
     } 
    } 
    } 
} 

내 문제이고, 나는 단어 "면"의 "제외"옵션에서 '악마'라고 삽입 할 때, '악마'와 일치하는 단어 (또는 단일 shingles)가 포함 된 패싯을 성공적으로 제거합니다. 하지만 2/3 단어 대상 포진, "주민 악", "악의적 인 컴퓨터", "내 사악한 고양이"는 제거되지 않습니다. "제외 단어"가 포함 된 문구의면을 제거하려면 어떻게합니까?

답변

0

달성하고자하는 것이 분명하지 않습니다. 일반적으로 분석 분야에서는 패싯을 만들지 않습니다. 어쩌면 우리는 왜 당신이 더 좋은 방법으로 원하는 것을 성취 할 수 있도록 대상 포진을 만드는지 설명 할 수 있습니다.

제외 패싯 매개 변수를 사용하면 특정 항목을 제외 할 수 있지만 evilresident evil과 다릅니다. 제외 시키려면 지정해야합니다. 패싯은 인덱싱 된 용어를 기반으로 만들어지며 resident evil은 실제로 인덱스의 단일 용어이며 evil이라는 용어와 동일하지 않습니다.

인덱싱 및 패 시팅을 위해 이미 선택했기 때문에 원하는 것을 얻을 수있는 방법이 있습니다. Elasticsearch에는 정말 강력한 스크립팅 모듈이 있습니다. 스크립트를 사용하여 다음과 같이 각 항목을 패싯에 포함할지 여부를 결정할 수 있습니다.

{ 
    "query": { 
    "match_all" : {} 
    }, 
    "facets": { 
    "tags": { 
     "terms": { 
     "field" : "tags", 
     "script" : "term.contains('evil') ? true : false" 
     } 
    } 
    } 
} 
+0

"스크립트"에 넣어야 할 항목 : 여러 개의 제외 단어 [ 'evil', 'i' , 'a', 'the']? – serpent403

+0

[mvel operators] (http://mvel.codehaus.org/Operators)를 살펴보십시오. 나는 당신이 그들을 OR에 넣을 수 있었다고 생각합니다. 예를 들어'term.contains ('evil') || term.contains ('i')'등 – javanna

+0

사실 나는 엄청난 양의 그러한 정지 키워드 데이터를 가지고있다. 이것이 올바른 방법일까요? 다른 방법이 있습니까? – serpent403