2017-03-28 4 views
1

내가 이런 식으로 색인하고 문서의 목록이 있습니다ElasticSearch 최고 단어에서 필터 정지 단어

[Keyword] 
    public List<string> Keywords   { get; set; } 
: 내 수업 AlbumMetaData에서

 ElasticIndex.CreateIndex(IndexName, _ => _ 
      .Mappings(__ => __ 
       .Map<AlbumMetadata>(
        M => M.AutoMap() 
        .Properties(P => P.Text(T => T.Name(N => N.Keywords) 
         .Analyzer("stop") 
         .Fields(F => F.Keyword(K => K.Name("keywords")))))))); 

을, 필드 키워드 목록입니다

맨 위 용어를 검색하려면 다음 쿼리를 수행하십시오 (범주유형은 문제가되지 않습니다) :

 var Match = Driver.Search<AlbumMetadata>(_ => _ 
      .Query(Q => Q 
       .Term(P => P.Category, (int)Category) && Q 
       .Term(P => P.Type, (int)Type)) 
      .Source(F => F.Includes(S => S.Fields(L => L.Keywords))) 
      .Aggregations(A => A 
       .Terms("Tags", T => T 
        .Field(E => E.Keywords) 
        .Size(Limit) 
      ) 
     )); 

     var Tags = Match.Aggs.Terms("Tags").Buckets.ToDictionary(K => K.Key, V => V.DocCount); 

문제는 출력에, 나는, 일부 중지 단어뿐만 아니라 일부 기호를 얻을 수 있다는 것입니다 /와 같은 - & |

내가 뭘 잘못하고 있니?


편집 : 때로는 하나의 단어의

내가 제목 (전체 영어 문장)이 문서와 태그가

(목록 : 질문을 명확히하기 위해 , 여기에 내가 달성하기 위해 노력하고있는 무슨이다 태그는 2 단어 태그입니다).

제목과 태그를 기반으로 문서를 찾을 수 있어야합니다 (이상적으로는 단어 줄기 사용, 복수형 무시 등). 또한 상위 단어 목록을 추출해야합니다. 키워드 목록은 제목의 모든 단어와 태그 목록의 모든 항목을 연결 한 것입니다.

이 컨텍스트에서 적절한 색인을 만드는 방법은 무엇입니까? 또한, 내가 올바른 방식으로 집계를하는 ​​방법입니까?

답변

1

있어 몇 가지 : 당신은 인덱스를 만들 때

  1. 이 매핑에 .AutoMap()가 Elasticsearch 필드 POCO 속성 유형의 데이터 유형과 그들에게 적용되는 속성을 추론 할 것이다. 그런 다음 .Properties()은 이러한 유추 된 매핑을 무시합니다. 그래서, Keywords에 대한 당신의 매핑의 최종 결과는 keyword 데이터 타입으로 설정 적용 stop 분석기와 text 데이터 형 필드, 및 ("keywords.keywords"를 통해 쿼리 가능) "keywords"multi-field 서브 필드이다.
  2. 집계는 stop 분석기가 적용된 "keywords"text 필드에서 실행됩니다. stop 분석기 uses English stop words by default이지만 인덱스에 사용자 정의 stop 분석기를 정의하여 다른 중지 단어로 stop 분석기를 구성 할 수 있습니다. stop 분석기는 /, -, &|과 같은 기호를 삭제하지 않습니다.
  3. 용어 집계를 사용하면 일반적으로 필드의 축 어적 용어로 집계를 가져오고 집계의 "keywords.keywords" 필드를 사용하여 매핑과 함께 얻을 수 있습니다. 하나의 토큰 만 생성한다는 점을 제외하고는 normalizer을 분석기와 유사한 keyword 필드에 적용 할 수 있습니다. 이는 keyword 필드가 잘 수행되고 대규모 집계에 적합한 디스크상의 원주 형 데이터 구조 인 doc_values을 사용하기 때문입니다.

    text 필드에서도 집계를 실행할 수 있지만 fielddata을 사용 설정하고 작동 방식을 알아야합니다. text 필드는 doc_values을 사용할 수 없습니다.

+0

고마워요 러스; 그것은 나를 위해 몇 가지를 명확히하고 있습니다. 필자는 문서를 색인화하는 방법이 그 맥락에서 의미가 있는지 궁금해하기 때문에 달성하려는 것을 설명하기 위해이 질문을 편집했습니다. 또한 노말 라이저에 대해 읽었을 때 실제로 사용할 수있는 것 같습니다. 네스트와 함께 사용되는 방법에 대한 참조가 있습니까? – Thomas

+0

'normalizer'에 대한 서면 참조가 없습니다. 근원을보십시오; 다음은 노말 라이저를 설정하는'keyword' 데이터 유형에 대한 테스트입니다 : https://github.com/elastic/elasticsearch-net/blob/5.x/src/Tests/Mapping/Types/Core/Keyword/KeywordPropertyTests.cs# L22 및 정적 메서드 호출 https://github.com/elastic/elasticsearch-net/blob/5.x/src/Tests/Analysis/Normalizers/NormalizerUsageTests.cs#L34-L42. 기본적으로 노말 라이저는 분석기와 비슷하지만 하나의 토큰/용어 만 출력하는 것으로 제한됩니다 ** –

+0

이렇게 정확하게 이해한다면 : 키워드를 텍스트 검색 및 매핑을위한 텍스트로 매핑합니다. 또한 태그 집계를위한 키워드 유형입니다 이것은 예상대로입니다. keyword.keyword 하위 필드 개념을 이해할 수 없습니까? 사실이 코드는 다른 스레드에서 나에게 준 도움을 기반으로했습니다 (http://stackoverflow.com/questions/41903195/elasticsearch-c-sharp-nest-getting-top-words-with-5-1?rq=1).)하지만 나는 여전히 Nest의 관점과 문서에서 보았 기 때문에 아마 Elastic의 용어 등과 매우 혼동 스럽다. – Thomas