2016-09-08 13 views
0

저는 Solr 5.5를 사용하고 있으며 해결책을 찾고 싶습니다.solr 싱글 쿼리가 일치하는 토큰 화 된 필드

<field name="exactName_noAlias_en_US" type="text_exact_query_tokenized" indexed="true" stored="false"/> 

<fieldtype name="text_exact_query_tokenized" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
      <tokenizer class="solr.KeywordTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/> 
     </analyzer> 
      <analyzer type="query"> 
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>      
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/> 
      <filter class="solr.ShingleFilterFactory" maxShingleSize="10"/> 
     </analyzer> 
    </fieldtype> 

같은 값을 가질 수이 필드 : 다음 "저스틴 비버 (Justin Bieber)는"

그리고 내 기대대로 :

은 내가 아래 설정을 사용하여 만든 필드가

"예술가 Justin Bieber는 10 대들의 시선"이라는 질문에이 문서와 일치 시키길 원합니다. "Bieber Justin이라는 아티스트는 캐나다인입니다"또는 "저스틴 이름이 너무 일반적입니다"와 같은 검색어는 성냥을 찾기로되어 있지 않습니다.

정확히 일치하는 경우에도 "Justin Bieber"쿼리를 발행 할 때 기본 '/ select'요청 처리기를 사용하면 일치하는 항목을 찾을 수 없습니다. 그러나 다른 필드에 대한 기본 필드로 설정 한 '선택 /'RH, 그래서, 나는 아래 컬 사용하여 다른 RH를 만들려고 :

curl http://localhost/solr/performer/config -H 'Content-type:application/json' -d '{"add-requesthandler" : {"name": "/exactName","class":"solr.SearchHandler","defaults":{ "echoParams":"explicit" ,"rows":10, "df":"exactName_noAlias_en_US", "q.op":"AND" },"useParams":"x"}}' 

그것은 RH 내가 원하는하지만 내 쿼리가 여전히 didn를 '을 만들었을 필요한 문서와 일치하지 않습니다.

이 문제에 대한 해결책을 알려주십시오. "& 중량 = JSON & 들여 쓰기 = 사실 & 디버그 = 사실 저스틴 % 20Bieber/exactName Q = exactName_noAlias_en_US :"

다음

Here is a screenshot from the Analysis screen.

쿼리에 대한 응답의 '디버그'섹션의 코드 조각입니다
"debug":{ 
    "rawquerystring":"exactName_noAlias_en_US:Justin Bieber", 
    "querystring":"exactName_noAlias_en_US:Justin Bieber", 
    "parsedquery":"+exactName_noAlias_en_US:justin +exactName_noAlias_en_US:bieber", 
    "parsedquery_toString":"+exactName_noAlias_en_US:justin +exactName_noAlias_en_US:bieber", 
    "explain":{}, 

그리고 아래는 쿼리에 대한 응답의 '디버그'섹션의 코드 조각입니다 : "선택/Q = exactName_noAlias_en_US : 저스틴 % 20Bieber & 중량 = JSON & 들여 쓰기 = 사실 & 디버그 = true"로

"debug":{ 
    "rawquerystring":"exactName_noAlias_en_US:Justin Bieber", 
    "querystring":"exactName_noAlias_en_US:Justin Bieber", 
    "parsedquery":"+exactName_noAlias_en_US:justin +searchKeywords_en_US:bieber", 
    "parsedquery_toString":"+exactName_noAlias_en_US:justin +searchKeywords_en_US:bieber", 
    "explain":{}, 

그리고 아래 선택 RH /와 구문 쿼리에 대한 응답의 '디버그'섹션의 코드 조각입니다 : "선택/Q = exactName_noAlias_en_US :"저스틴 % 20Bieber "& 중량 = JSON & 들여 쓰기 = "/ exactName Q = exactName_noAlias_en_US :?"저스틴 % 20Bieber "& 중량 사실 진정한 & 디버그 = 아래

"debug":{ 
    "rawquerystring":"exactName_noAlias_en_US:\"Justin Bieber\"", 
    "querystring":"exactName_noAlias_en_US:\"Justin Bieber\"", 
    "parsedquery":"MultiPhraseQuery(exactName_noAlias_en_US:\"(justin justin bieber) bieber\")", 
    "parsedquery_toString":"exactName_noAlias_en_US:\"(justin justin bieber) bieber\"", 
    "explain":{}, 

그리고는/exactName RH와 구문 쿼리에 대한 응답의 '디버그'섹션의 조각입니다 = json & 들여 쓰기 = true & 디버그 = true 다음은

"debug":{ 
"rawquerystring":"exactName_noAlias_en_US:\"Justin Bieber\"", 
"querystring":"exactName_noAlias_en_US:\"Justin Bieber\"", 
"parsedquery":"MultiPhraseQuery(exactName_noAlias_en_US:\"(justin justin bieber) bieber\")", 
"parsedquery_toString":"exactName_noAlias_en_US:\"(justin justin bieber) bieber\"", 
"explain":{}, 

쿼리와 쿼리의 공백을 해당 디버그 섹션 탈출이다

select?q=Justin\ Beiber&df=exactName_noAlias_en_US 

디버그 :

"rawquerystring":"Justin\\ Beiber", 
"querystring":"Justin\\ Beiber", 
"parsedquery":"+((exactName_noAlias_en_US:justin exactName_noAlias_en_US:justin beiber)/no_coord) +exactName_noAlias_en_US:beiber", 
"parsedquery_toString":"+(exactName_noAlias_en_US:justin exactName_noAlias_en_US:justin beiber) +exactName_noAlias_en_US:beiber", 
"explain":{}, 
+0

관리 페이지의 "분석"페이지에서 출력을 보았습니까? 이렇게하면 인덱싱 된 콘텐츠와 쿼리를 모두 입력하고 양쪽에서 생성되는 토큰 및 양쪽에서 동일한 토큰을 얻는 지 여부를 확인할 수 있습니다. 기본 필드를 제공하는 디버깅 또는 URL의 쿼리 필드는 일반적으로 요청 처리기를 변경하거나 추가하는 것보다 쉽습니다. – MatsLindh

+0

네, 그랬습니다. 나는 그 도구에서 내가 원하는 것을 정확하게 본다. 그러나 내가 위에서 언급 한/select RH 또는 custom one '/ exactName'을 사용하여 http를 통해 쿼리를 발행 할 때 동일한 동작을 보지 못합니다. – oveflown

+0

분석 단계의 결과를 포함시킬 수 있습니까? 또한 분석기의 색인 부분을 변경하면 해당 문서를 다시 색인해야합니다. – MatsLindh

답변

0

마지막 항목에 대한 parsedquery 디버그 정보를 보여줍니다 두 개의 다른 필드에서 검색하고 있습니다. 하나는 입력 한 필드이고 다른 하나는 이전에 설정 한 기본 검색 필드입니다.각 필드에서 검색하는 내용이 포함 된 단일 토큰도 없으므로 조회수가 발생하지 않습니다. 또한 분석 결과에 히트가 표시되는 이유이기도하지만 검색 할 때 히트를 내지 않으므로 실제 쿼리는 분석 페이지에서 제공 한 것과 동일하지 않습니다.

+exactName_noAlias_en_US:justin +searchKeywords_en_US:bieber" 
^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^^^^ 

첫 번째 항목

는 다음 문서의 두 집합의 교집합을 요청, 두 개의 토큰을 찾고 있다는 것을 보여줍니다 - 둘은 하나의 토큰이, 당신이 타격을하지 않는 것을 포함하지 않기 때문에.

exactName_noAlias_en_US:"Justin Bieber"을 검색하면 원하는 답변을 얻을 수 있습니다.

+0

나는 그것을 시도했지만 여전히 운이 없다. 이러한 쿼리의 디버그 섹션을 원본 메시지에 포함 시켰습니다. – oveflown

0

대상 포진을 사용하려면 구문 분석기가 쿼리를 구문 분석하고 공간이있는 기본 연산자를 적용해야합니다. 그것은 탈출 공간으로 할 수 있습니다. 가능한 쿼리는 다음과 같습니다

  • Q = exactName_noAlias_en_US : (저스틴 \ 비버)
  • Q = 저스틴 \ 비버 & DF = exactName_noAlias_en_US
  • Q = 저스틴 \ 비버 (당신이 당신의 핸들러에 정의 된 DF 않은 경우)

몇 가지 추가 사항 :

  • 인터넷에서 차이가있다 필드 이름을 'exactMatch'로 정의하고 'exactName_noAlias_en_US'쿼리를 사용하면
  • 새 쿼리 처리기가 필요하지 않아 df를 재정의 할 수 있습니다. 쿼리에서 제공 할 수 있습니다.
  • 명시 적으로 필드 이름을 제공하는 경우 df가 필요하지 않습니다.
+0

답장을 보내 주셔서 감사합니다. 아직 예상대로 작동하지 않는 것 같습니다. 원본 메시지에 디버그 부분과 쿼리를 포함합니다. – oveflown

+0

'q.op = OR'을 쿼리에 추가하면 트릭을 수행합니다. Thanks @earnau – oveflown

+0

예 - OR은 기본 운영자이므로 작동하려면 설정해야한다는 사실을 잊어 버렸습니다. – earnau