2013-08-07 2 views
1

20000 개가 넘는 객체가있는 거대한 JSON 파일이 있습니다. 이 json 파일에서 문자열을 쿼리하고 싶습니다. 그러나 jsonpath을 사용하여 정확한 일치 항목 만 찾을 수 있었습니까? 내가하고 싶은 무엇jsonpath로 문자열 검색

{ "store": { 
    "book": [ 
     { "category": "reference", 
     "author": "Nigel Rees", 
     "title": "Sayings of the Century", 
     "price": 8.95 
     }, 
     { "category": "fiction", 
     "author": "Evelyn Waugh", 
     "title": "Sword of Honour", 
     "price": 12.99 
     }, 
     { "category": "fiction", 
     "author": "Herman Melville", 
     "title": "Moby Dick", 
     "isbn": "0-553-21311-3", 
     "price": 8.99 
     }, 
     { "category": "fiction", 
     "author": "J. R. R. Tolkien", 
     "title": "The Lord of the Rings", 
     "isbn": "0-395-19395-8", 
     "price": 22.99 
     } 
    ], 
    "bicycle": { 
     "color": "red", 
     "price": 19.95 
    } 
    } 
} 

은 다음과 같습니다 :

jsonPath(data, "$..book[?(@.title like 'ord')]") 

을 자신의 제목에 "ORD"를 가진 책을 얻을

이의 내 파일이 같은입니다 가정 해 봅시다.

{ "category": "fiction", 
     "author": "J. R. R. Tolkien", 
     "title": "The Lord of the Rings", 
     "isbn": "0-395-19395-8", 
     "price": 22.99 
     } 
{ "category": "fiction", 
     "author": "Evelyn Waugh", 
     "title": "Sword of Honour", 
     "price": 12.99 
} 

가능합니까?

답변

4

업데이트 :

the unit teststhis answer에 따르면, 당신은 표현의 문자 정규식을 포함 할 수 있으며 evaled됩니다. 다음은 단위 테스트의 예제입니다.

$.menu.items[?(@ && @.label && /SVG/.test(@.label))].id 

따라서, 귀하의 예를 들어, 다음과 같습니다 나는 꽤 큰 JSON 파일 (2-3메가바이트)에 대한 jsonPath을 사용했습니다

$.store.book[ ?(@ && @.title && /ord/.test(@.title)) ].isbn 

을 그리고 그들은 우리의 응용 프로그램의 원인이었다 둔화 . 실적과 관련하여 궁금한 점이 있다면 검색 할 각 입력란에 대한 보완 색인을 만드는 것이 좋습니다. 이렇게하면 각 필드의 관련성 값에 가중치를 부여 할 수 있습니다. 이는 좋은 검색 결과를 얻기 위해 매우 중요합니다.

더 나아가 응용 프로그램이 커질 것으로 예상되는 경우 서버 측 검색 엔진 (http://sphinxsearch.com/ 또는 SAAS 버전 http://indexden.com/)을 사용하는 것이 좋습니다.

특정 문제에 대해서는 비슷한 연산자가 지원되어야합니다. 그러나, 나는 문자열의 배열 (예 : 데이터 구조의 제목)과 일반 자바 스크립트 정규식 (http://www.w3schools.com/jsref/jsref_obj_regexp.asp)을 사용하여 꽤 좋은 성능을 얻을 수있었습니다.

+0

답장을 보내 주셔서 감사합니다. 하지만 jsonpath에서 "like"연산자를 찾을 수 없었습니다. 지원되지 않는다는 뜻입니까? – huzeyfe

+1

내가 틀 렸습니다. 분명히 LIKE 연산자는 지원되지 않았습니다. 그러나 jsonPath 유닛 테스트에서 정규 표현식의 사용법을 발견했습니다. 그 사용법에 대한 링크 된 답변을 업데이트했습니다. – Homer6

+1

이 솔루션을 처리하기 위해 eval을 사용하고 있습니다. 따라서 검색을 위해 사용자가 제출 한 데이터를 사용하는 경우에는 입력을 적절하게 필터링하고 이스케이프 처리하여 악의적 인 사용자가 다른 사용자 대신 코드를 실행할 수 없도록해야합니다 (또는이 jsonPath가 node.js 등을 통해 서버 측에서 실행 중인지 여부). – Homer6