2017-10-09 112 views
0

情況彈性同義詞使用

使用彈性版本:2.3.1

我已經配置像這樣

PUT /my_index 
{ 
    "settings": { 
    "analysis": { 
     "filter": { 
     "my_synonym_filter": { 
      "type": "synonym", 
      "synonyms": [ 
      "british,english", 
      "queen,monarch" 
      ] 
     } 
     }, 
     "analyzer": { 
     "my_synonyms": { 
      "tokenizer": "standard", 
      "filter": [ 
      "lowercase", 
      "my_synonym_filter" 
      ] 
     } 
     } 
    } 
    } 
} 

,這是偉大的彈性指數,當我查詢文件和使用查詢字詞「英文」或「女王」我得到所有文件匹配英國君主。當我在過濾器聚合中使用同義詞時,它不起作用。例如

在我的索引我有5個文件,其中3個有君主,其中2個有女王

POST /my_index/_search 
{ 
    "size": 0, 
    "query" : { 
     "match" : { 
     "status.synonym":{ 
      "query": "queen", 
      "operator": "and" 
     } 
     } 
    }, 
    "aggs" : { 
     "status_terms" : { 
      "terms" : { "field" : "status.synonym" } 
     }, 
     "monarch_filter" : { 
      "filter" : { "term": { "status.synonym": "monarch" } } 
     } 
    }, 
    "explain" : 0 
} 

結果產生:

總共點擊:

  • 5 doc count(如預期的那樣,太棒了!)
  • 狀態條件:5個文件數爲女王(如預期的那樣,太棒了!)
  • 君主濾波器:0 DOC計數

我已經嘗試了不同的同義詞濾波器配置:

  • 王后,闢
  • 王后,闢=>王后
  • 王后,闢=>女王,君主

但是,上述並沒有改變結果。我想得出結論,也許你可以在查詢時使用過濾器,但如果術語聚合工作,爲什麼不應該過濾,因此我認爲它的同義詞過濾器配置是錯誤的。更廣泛的同義詞過濾器示例可以在here找到。

問題

如何使用/配置過濾器聚集同義詞?

實施例中複製的情況下,上述: 1.創建和配置索引:

PUT /my_index 
{ 
    "settings": { 
    "analysis": { 
     "filter": { 
     "my_synonym_filter": { 
      "type": "synonym", 
      "synonyms": [ 
      "wlh,wellhead=>wellwell" 
      ] 
     } 
     }, 
     "analyzer": { 
     "my_synonyms": { 
      "tokenizer": "standard", 
      "filter": [ 
      "lowercase", 
      "my_synonym_filter" 
      ] 
     } 
     } 
    } 
    } 
} 

PUT my_index/_mapping/job 
{ 
    "properties": { 
    "title":{ 
     "type": "string", 
     "analyzer": "my_synonyms" 
    } 
    } 
} 

2.Put兩個文件:

PUT my_index/job/1 
{ 
    "title":"wellhead smth else" 
} 

PUT my_index/job/2 
{ 
    "title":"wlh other stuff" 
} 

3。執行wlh的搜索,它應該返回2個文檔;有哪些不應該有0計數方面聚集了應有的2個文件wellwell和過濾器:

POST my_index/_search 
{ 
    "size": 0, 
    "query" : { 
     "match" : { 
     "title":{ 
      "query": "wlh", 
      "operator": "and" 
     } 
     } 
    }, 
    "aggs" : { 
     "wlhAggs" : { 
      "terms" : { "field" : "title" } 
     }, 
     "wlhFilter" : { 
      "filter" : { "term": { "title": "wlh"  } } 
     } 
    }, 
    "explain" : 0 
} 

此查詢的結果是:

{ 
    "took": 8, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 2, 
     "max_score": 0, 
     "hits": [] 
    }, 
    "aggregations": { 
     "wlhAggs": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
       "key": "wellwell", 
       "doc_count": 2 
      }, 
      { 
       "key": "else", 
       "doc_count": 1 
      }, 
      { 
       "key": "other", 
       "doc_count": 1 
      }, 
      { 
       "key": "smth", 
       "doc_count": 1 
      }, 
      { 
       "key": "stuff", 
       "doc_count": 1 
      } 
     ] 
     }, 
     "wlhFilter": { 
     "doc_count": 0 
     } 
    } 
} 

並且那是我的問題, wlhFilter應該至少有1個文檔數。

回答

1
與@Byron Voorbach下面,他的意見本的幫助

所以是我的解決方案:

  • 我創建了一個單獨的領域,我用同義詞分析儀上,因爲 不是具有屬性域(主場。屬性)。
  • 而最重要的問題是我的同義詞被縮小了!例如,我有 英國英語=>英國。將其更改爲 british,english,uk解決了我的問題,並且過濾器聚合爲 返回了正確數量的文檔。

希望這可以幫助某人,或者至少指向正確的方向。

編輯: 哦,上帝讚美文件!我完全解決了我的問題,使用過濾器(S!)聚合(鏈接here)。在過濾器配置中,我指定了Match類型的查詢並且它工作正常!結束了這樣的事情:

"aggs" : { 
    "messages" : { 
     "filters" : { 
     "filters" : { 
      "status" : { "match" : { "cats.saurus" : "monarch" }}, 
      "country" : { "match" : { "cats.saurus" : "british" }} 
     } 
     } 
    } 
    } 
+0

很好,你明白了! –

+0

我在同一時間發佈更新。甚至找到了更好的解決方案。謝謝你的幫助 –

1

我時間很短,所以如果需要的話,我可以在今天/明天晚些時候詳細闡述一下。但下面應該工作:

DELETE /my_index 
PUT /my_index 
{ 
    "settings": { 
    "analysis": { 
     "filter": { 
     "my_synonym_filter": { 
      "type": "synonym", 
      "synonyms": [ 
      "british,english", 
      "queen,monarch" 
      ] 
     } 
     }, 
     "analyzer": { 
     "my_synonyms": { 
      "tokenizer": "standard", 
      "filter": [ 
      "lowercase", 
      "my_synonym_filter" 
      ] 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "test": { 
     "properties": { 
     "title": { 
      "type": "text", 
      "analyzer": "my_synonyms", 
      "fielddata": true 
     } 
     } 
    } 
    } 
} 
POST my_index/test/1 
{ 
    "title" : "the british monarch" 
} 

GET my_index/_search 
{ 
    "query": { 
    "match": { 
     "title": "queen" 
    } 
    } 
} 

GET my_index/_search 
{ 
    "query": { 
    "match": { 
     "title": "queen" 
    } 
    }, 
    "aggs": { 
    "queen_filter": { 
     "filter": { 
     "term": { 
      "title": "queen" 
     } 
     } 
    }, 
    "monarch_filter": { 
     "filter": { 
     "term": { 
      "title": "monarch" 
     } 
     } 
    } 
    } 
} 

你能分享您爲status.synonym字段定義的映射?

編輯:V2

之所以你的過濾器的輸出爲0,是因爲在Elasticsearch過濾器永遠不會通過分析階段。這意味着完全匹配。

聚合中的標記'wlh'不會被翻譯爲'wellwell',這意味着它不會出現在倒排索引中。這是因爲在索引期間,你的'wlh'被翻譯成'wellwell'。 爲了達到您想要的效果,您必須將數據編入一個單獨的字段並相應地調整您的過濾器。

你可以嘗試這樣的:

DELETE my_index 
PUT /my_index 
{ 
    "settings": { 
    "number_of_shards": 1, 
    "number_of_replicas": 0, 
    "analysis": { 
     "filter": { 
     "my_synonym_filter": { 
      "type": "synonym", 
      "synonyms": [ 
      "wlh,wellhead=>wellwell" 
      ] 
     } 
     }, 
     "analyzer": { 
     "my_synonyms": { 
      "tokenizer": "standard", 
      "filter": [ 
      "lowercase", 
      "my_synonym_filter" 
      ] 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "job": { 
     "properties": { 
     "title": { 
      "type": "string", 
      "fields": { 
      "synonym": { 
       "type": "string", 
       "analyzer": "my_synonyms" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

PUT my_index/job/1 
{ 
    "title":"wellhead smth else" 
} 

PUT my_index/job/2 
{ 
    "title":"wlh other stuff" 
} 

POST my_index/_search 
{ 
    "size": 0, 
    "query": { 
    "match": { 
     "title.synonym": { 
     "query": "wlh", 
     "operator": "and" 
     } 
    } 
    }, 
    "aggs": { 
    "wlhAggs": { 
     "terms": { 
     "field": "title.synonym" 
     } 
    }, 
    "wlhFilter": { 
     "filter": { 
     "term": { 
      "title": "wlh" 
     } 
     } 
    } 
    } 
} 

輸出:

{ 
    "aggregations": { 
    "wlhAggs": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
     { 
      "key": "wellwell", 
      "doc_count": 2 
     }, 
     { 
      "key": "else", 
      "doc_count": 1 
     }, 
     { 
      "key": "other", 
      "doc_count": 1 
     }, 
     { 
      "key": "smth", 
      "doc_count": 1 
     }, 
     { 
      "key": "stuff", 
      "doc_count": 1 
     } 
     ] 
    }, 
    "wlhFilter": { 
     "doc_count": 1 
    } 
    } 
} 

希望這有助於!

+0

我猜關鍵是「fielddata」:true。如果是這種情況,Id有興趣知道爲什麼同義詞領域術語聚合工作沒有設置和過濾一個doesnt。需要了解如何使用NEST設置字段數據選項,因爲據我所見,沒有直接的方法來設置真正的標誌。謝謝你的收穫,會回來給你 –

+1

如果你能向我展示你的同義詞領域的映射,我們可以看到發生了什麼問題。看起來你正在使用的過濾器聚合可能是針對未分析的字段。如果這是真的,那麼ES不會將「女王」存儲在倒排索引中,因爲它不使用同義詞分析器進行分析。 我有fielddata = true的原因是因爲(沒有設置)不可能在'文本'字段上聚合。這就是爲什麼你似乎在不解決同義詞的字段上進行聚合:) –

+0

我已經添加了一個示例代碼部分,您可以使用它來複制我的問題。我應該真的開始,讓問題更清潔,但不要混淆東西,我不會編輯它的問題部分。此外,ES版本是2.3.1,我無法複製您的示例,因爲文本不是屬性/功能,直到更高版本。當然,如果需要進行版本升級才能使其發揮作用,那麼這不是問題,但是如果這是「最後的手段」,Id更喜歡。 –