MCPcopy Create free account
hub / github.com/HzaCode/OneCite / _search_crossref

Method _search_crossref

onecite/pipeline/identifier.py:1399–1524  ·  view source on GitHub ↗

CrossRef search with query optimization.

(self, query: str, limit: int = 15)

Source from the content-addressed store, hash-verified

1397 return None
1398
1399 def _search_crossref(self, query: str, limit: int = 15) -> List[Dict]:
1400 """CrossRef search with query optimization."""
1401 try:
1402 # Optimize query parameters
1403 params = {
1404 'query': query,
1405 'query.bibliographic': query,
1406 'query.title': query,
1407 'rows': limit,
1408 'sort': 'relevance',
1409 'mailto': 'onecite@users.noreply.github.com'
1410 }
1411
1412 # Try multiple query strategies
1413 search_strategies = [
1414 params,
1415 {**params, 'query.author': query.split('.')[0] if '.' in query else query},
1416 {**params, 'filter': 'type:journal-article,proceedings-article,book-chapter,book,monograph'},
1417 ]
1418
1419 all_results = []
1420 seen_dois = set()
1421
1422 for i, strategy_params in enumerate(search_strategies):
1423 try:
1424 self.logger.debug(f"CrossRef search strategy {i+1}")
1425 url = f"{self.crossref_base_url}"
1426 response = requests.get(url, params=strategy_params, timeout=15)
1427 response.raise_for_status()
1428 data = response.json()
1429
1430 for item in data.get('message', {}).get('items', []):
1431 doi = item.get('DOI')
1432 if not doi or doi in seen_dois:
1433 continue
1434
1435 # More complete data extraction
1436 result = {
1437 'source': 'crossref',
1438 'doi': doi,
1439 'title': item.get('title', [''])[0] if item.get('title') else '',
1440 'authors': [],
1441 'year': None,
1442 'journal': '',
1443 'citations': item.get('is-referenced-by-count', 0),
1444 'type': item.get('type', ''),
1445 'url': f"https://doi.org/{doi}",
1446 'publisher': item.get('publisher', ''),
1447 'volume': item.get('volume', ''),
1448 'issue': item.get('issue', ''),
1449 'pages': item.get('page', ''),
1450 'isbn': None,
1451 'edition': item.get('edition-number', '')
1452 }
1453
1454 # Handle ISBN (book-specific)
1455 if item.get('ISBN'):
1456 isbns = item.get('ISBN', [])

Callers 2

_fuzzy_searchMethod · 0.95

Calls 2

raise_for_statusMethod · 0.45
jsonMethod · 0.45

Tested by 1